Python多进程
程序员文章站
2022-04-04 17:03:10
进程:是资源的集合,一个进程至少包含一个线程。所有程序的进程由系统的父进程拉起。如linux中所有进程由PID:1的进程创建 进程间数据交互: 这里需要用到进程包的queue,由于多个进程无法共享数据,所以没有办法使用import queue 1 from multiprocessing impor ......
进程:是资源的集合,一个进程至少包含一个线程。所有程序的进程由系统的父进程拉起。如linux中所有进程由PID:1的进程创建
进程间数据交互:
这里需要用到进程包的queue,由于多个进程无法共享数据,所以没有办法使用import queue
1 from multiprocessing import Process,Queue 2 3 def pan(rr): 4 rr.put([1,"2sdf"]) 5 6 if __name__ == "__main__": 7 #创建进程queue队列对象 8 q = Queue() 9 #创建子进程,target=函数名,args=进程队列对象 10 p = Process(target=pan,args=(q,)) 11 #启动进程 12 p.start() 13 #获取队列中的值 14 print(q.get()) 15 #等待进程结束 16 p.join()
通过Pipe(管道)实现进程间数据交互
1、管道是一发一收机制
2、如果收的次数大于发的次数,程序就会卡住
1 from multiprocessing import Process,Pipe 2 3 def execut(conn): 4 conn.send([1,"hello word"]) 5 print("接收主进程发来的消息:%s"%conn.recv()) 6 7 if __name__ == "__main__": 8 #创建管道对象,当管道对象创建后必定返回两个参数,把这两个参数分别赋给不同的进程即可 9 Apipe,Bpipe = Pipe() 10 p = Process(target=execut,args=(Bpipe,)) 11 p.start() 12 print("接收子进程发来的消息:%s"%Apipe.recv()) 13 Apipe.send({"王阳明": "传习录"}) 14 p.join()
通过Manager包创建多进程共享
1 #进程间共享一份数据 2 #这里Manager实际是将主进程创建的内存对象拷贝给子进程,在所有进程结束后合并所有进程产生的数据。 3 4 from multiprocessing import Process,Manager 5 import os 6 7 def run(dt,lt): 8 dt["name"] = "sober" 9 dt["workdata"] = "2018-05-09" 10 lt.append(os.getpid()) 11 print(lt) 12 13 if __name__ == "__main__": 14 with Manager() as mng: 15 #使用Manager对象创建一个共享字典 16 dt = mng.dict() 17 #使用Manager对象创建一个共享列表 18 lt = mng.list() 19 #存储子进程对象 20 plist = [] 21 for i in range(5): 22 #创建子进程 23 p = Process(target=run,args=(dt,lt)) 24 p.start() 25 plist.append(p) 26 for n in plist: 27 #等待所有子进程结束 28 n.join() 29 30 print(dt) 31 print(lt)
进程池使用
1 from multiprocessing import Process,Pool 2 import os 3 4 def run(n): 5 #创建子进程执行函数 6 print("Start number: %s"%n) 7 8 def backDef(b): 9 #显示回调函数的信息,打印执行回调函数的PID 10 print("CallBacke Def :%s"%b,os.getpid()) 11 12 if __name__ == "__main__": 13 print("Print master processes PID:%s"%os.getpid()) 14 #定义一个进程池,限制进程数为:2 15 pl = Pool(processes=2) 16 #创建进程 17 for i in range(10): 18 #异步进程,func=进程执行方法名,args=方法参数,callback=回调函数 19 pl.apply_async(func=run,args=(i,),callback=backDef) 20 print("Test finish") 21 #先关闭池子,在等待池子内的工作都完成 22 pl.close() 23 pl.join()
上一篇: .Net中验证码图片生成