欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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()