python 多进程
进程:资源的集合,适用于cpu密集型操作
from multiprocessing import Process ###多进程 import time import threading def run(name): print ("hello %s" % name) t = threading.Thread(target=thread) t.start() def thread(): print (threading.get_ident()) if __name__ == '__main__': for i in range(10): p = Process(target=run,args=('%s' % i,)) p.start()
进程池
进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。
进程池中有两个方法:
- apply
- apply_async
from multiprocessing import Process, Pool,freeze_support import time def Foo(i): time.sleep(2) return i + 100 def Bar(arg): print('-->exec done:', arg) if __name__ == '__main__': pool = Pool(5) ##允许进程池里同时放入5个进程 for i in range(10): pool.apply_async(func=Foo, args=(i,), callback=Bar) ##异步执行,回调函数,执行完foo后执行bar(由主进程执行) #pool.apply(func=Foo, args=(i,)) print('end') pool.close() pool.join() # 进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。
进程间通讯
首先看示例
from multiprocessing import Process,Queue ###多进程 import threading,queue def f(qq): qq.put([42,None,'hello']) if __name__ == '__main__': q = queue.Queue() p = Process(target=f,args=(q,)) p.start() print (q.get())

线程及线程间通讯

进程及进程间通讯
from multiprocessing import Process,Queue ###多进程 def f(qq): qq.put([42,None,'hello']) if __name__ == '__main__': q = Queue() p = Process(target=f,args=(q,)) p.start() print (q.get())

通过管道实现进程间通讯
from multiprocessing import Process,Pipe ###多进程,管道一生成会返回两个对象 def f(qq): qq.send([42,None,'hello']) ####发消息 print (qq.recv()) ##收消息 qq.close() if __name__ == '__main__': parent_conn,children_conn = Pipe() p = Process(target=f,args=(children_conn,)) p.start() print (parent_conn.recv()) ##收消息 parent_conn.send("hello children") ###发消息

进程间数据共享
from multiprocessing import Process, Manager import os def f(d, l): d[1] = '1' d['2'] = 2 d[0.25] = None l.append(os.getpid()) print(l) if __name__ == '__main__': with Manager() as manager: d = manager.dict() ####生成一个字典,可在进程间共享和传递 l = manager.list(range(5)) ####生成一个列表,可在进程间共享和传递 p_list = [] for i in range(10): p = Process(target=f, args=(d, l)) p.start() p_list.append(p) for res in p_list: res.join() print(d) print(l) ####发消

浙公网安备 33010602011771号