python----进程
一、创建进程的两种方式
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