一、创建进程的两种方式
1.1 普通创建
Process([group[,target[,name[,args[,kwargs]]]]]) ,由该实例化得到的对象,
表示一个子进程的任务(尚未启动)
注意(参数介绍):
1.需要使用关键字参数的方式来指定参数
2.args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号
3.group参数为使用,值始终未None
4.target表示调用对象,即子进程要执行的任务
5.args表示调用对象的字典,kwargs={"name_":"json","age":19}
6.name为子进程的名字
方法介绍:
1.p.start():启动进程,并调用该子进程中的p.run()方法
2.p.run():进程启动时运行的方法,正是它去调用target指定的函数,
我们自定义类的类中一定要实现该方法
3.p.terminate():强制终止进程p,不会进行任何清理操作
4.p.is_alive():如果仍然运行,返回True
5.p.join(timeout):主进程等待p终止(注意:主进程处于等的状态,而p
是处于运行的状态)timeout是可选的超出时间,需要强调的是p.join只能join
主start开启的进程,而不能join住run开启的进程.
1.2 类式创建
from multiprocessing import Process,Queue
import time
class Myprocess(Process):
def __init__(self):
super(Myprocess,self).__init__()
def run(self):
time.sleep(2)
print(self.name,time.ctime())
if __name__ == '__main__':
list = []
for i in range(3):
m = Myprocess()
list.append(m)
m.start()
for a in list:
a.join()
二、进程间的通信
2.1 通过队列
这个multiprocessing.Queue是属于进程的,而之前曾经学习过的queue模块则是属于线程的,在这里不适用
from multiprocessing import Process,Queue
import time
class Myprocess(Process):
def __init__(self,q,n):
super(Myprocess,self).__init__()
self.q = q
self.n = n
def run(self):
time.sleep(2)
self.q.put(['hello',self.n,id(self.q)])
if __name__ == '__main__':
list = []
q = Queue()
print('main_id:',id(q))
for i in range(3):
m = Myprocess(q,i)
list.append(m)
m.start()
print(q.get())
print(q.get())
print(q.get())
for a in list:
a.join()
运行结果:
main_id: 1896093746176
['hello', 0, 2431766385104]
['hello', 1, 2380120477992]
['hello', 2, 1310696559000]
2.2 通过管道
主进程与子进程之间的通信
class myprocess(Process):
def __init__(self,cnn):
Process.__init__(self)
self.cnn = cnn
def run(self):
print(self.cnn.recv())
self.cnn.send('hello,i am subprocess:%s'%id(self))
self.cnn.close()
if __name__ == '__main__':
parant_cnn,child_cnn = Pipe()#创建管道
p = myprocess(child_cnn)#创建子进程
p1 = myprocess(child_cnn)#创建子进程1
p.start()
p1.start()
#主进程发送数据,子进程接收,再发送
parant_cnn.send('nice to meet you,i am the main process')
parant_cnn.send('nice to meet you,i am the main process')
print(parant_cnn.recv())
print(parant_cnn.recv())
运行结果:
nice to meet you,i am the main process
hello,i am subprocess:2535314083400
nice to meet you,i am the main process
hello,i am subprocess:2157773246024