简单谈谈python中的多进程
进程是由系统自己管理的。
1:最基本的写法
frommultiprocessingimportPool deff(x): returnx*x if__name__=='__main__': p=Pool(5) print(p.map(f,[1,2,3])) [1,4,9]
2、实际上是通过os.fork的方法产生进程的
unix中,所有进程都是通过fork的方法产生的。
multiprocessingProcess os info(title): title ,__name__ (os,):,os.getppid() ,os.getpid() f(name): info() ,name __name__==: info() p=Process(=f,=(,)) p.start() p.join()
3、线程共享内存
threading run(info_list,n): info_list.append(n) info_list __name__==: info=[] i(): p=threading.Thread(=run,=[info,i]) p.start() [0] [0,1] [0,1,2] [0,1,2,3] [0,1,2,3,4] [0,1,2,3,4,5] [0,1,2,3,4,5,6] [0,1,2,3,4,5,6,7] [0,1,2,3,4,5,6,7,8] [0,1,2,3,4,5,6,7,8,9]
进程不共享内存:
multiprocessingProcess run(info_list,n): info_list.append(n) info_list __name__==: info=[] i(): p=Process(=run,=[info,i]) p.start() [1] [2] [3] [0] [4] [5] [6] [7] [8] [9]
若想共享内存,需使用multiprocessing模块中的Queue
multiprocessingProcess,Queue f(q,n): q.put([n,]) __name__==: q=Queue() i(): p=Process(=f,=(q,i)) p.start() : q.get()
4、锁:仅是对于屏幕的共享,因为进程是独立的,所以对于多进程没有用
multiprocessingProcess,Lock f(l,i): l.acquire() ,i l.release() __name__==: lock=Lock() num(): Process(=f,=(lock,num)).start() helloworld0 helloworld1 helloworld2 helloworld3 helloworld4 helloworld5 helloworld6 helloworld7 helloworld8 helloworld9
5、进程间内存共享:Value,Array
multiprocessingProcess,Value,Array f(n,a): n.value=i((a)): a[i]=-a[i] __name__==: num=Value(,) arr=Array(,()) num.value arr[:] p=Process(=f,=(num,arr)) p.start() p.join() 0.0 [0,1,2,3,4,5,6,7,8,9] 3.1415927 [0,-1,-2,-3,-4,-5,-6,-7,-8,-9]
#manager共享方法,但速度慢
multiprocessingProcess,Manager f(d,l): d[]=d[]=d[]=l.reverse() __name__==: manager=Manager() d=manager.dict() l=manager.list(()) p=Process(=f,=(d,l)) p.start() p.join() d l #print'-------------'这里只是另一种写法 #printpool.map(f,range(10)) {0.25:None,1:'1','2':2} [9,8,7,6,5,4,3,2,1,0]
#异步:这种写法用的不多
multiprocessingPool time f(x): x*x time.sleep() x*x __name__==: pool=Pool(=) res_list=[] i(): res=pool.apply_async(f,[i])res_list.append(res) rres_list: r.get(timeout=10)#超时时间
同步的就是apply