#队列中的ipc(进程间通信),作用是为了降低耦合性 # from multiprocessing import Process,Queue # # def consumer(q,name): # while 1: # a=q.get()#获得队列数据 # if a: # print("%s拿走了%s"%(name,a)) # else: # print("没货了") # break # # def producer(q,pro): # for i in range(20): # a="%s充气娃娃%s"%(pro,i) # q.put(a)#往队列中放置数据 # # q.put(None) # # if __name__ == '__main__': # q=Queue()#实例化一个队列 # p_pro=Process(target=producer,args=(q,"林志玲版")) # p_pro1 = Process(target=producer, args=(q, "刘亦菲版")) # p_pro2= Process(target=producer, args=(q, "波多版")) # p_con1=Process(target=consumer,args=(q,"盖伦")) # p_con2 = Process(target=consumer, args=(q, "压缩")) # l=[p_con1,p_con2,p_pro,p_pro1,p_pro2,] # [i.start() for i in l] # p_pro.join() # p_pro1.join() # p_pro2.join() # q.put(None)#传入标识,使消费者子进程停止 # q.put(None) # JoinableQueue的应用: # from multiprocessing import Process,JoinableQueue # # def consumer(q,name): # while 1: # a=q.get() # print("%s获得%s"%(name,a)) # q.task_done() # def producer(q): # for i in range(20): # a="%s充气娃娃"%str(i+1) # q.put(a) # q.join() # if __name__ == '__main__': # q=JoinableQueue(10) # p_pro=Process(target=producer,args=(q,)) # p_con=Process(target=consumer,args=(q,"alex")) # p_pro.start() # p_con.daemon=True # p_con.start() # p_pro.join() # 存取钱的模板: # from multiprocessing import Manager,Process,Lock # # def put_in(num,l): # l.acquire() # for i in range(100): # num['money']=num['money']+1 # print(num['money']) # l.release() # # def put_out(num,l): # l.acquire() # for i in range(100): # num['money']=num['money']-1 # print(num['money']) # l.release() # # if __name__ == '__main__': # l=Lock() # m=Manager() # num=m.dict({'money':100}) # p_out=Process(target=put_out,args=(num,l)) # p_out.start() # p_in=Process(target=put_in,args=(num,l)) # p_in.start() # p_in.join() # p_out.join() # print(num['money']) #进程池的应用:1.map(函数,可迭代对象);2.apply(函数,参数);3.apply_async(函数,参数,回调函数) from multiprocessing import Pool #map引用:速度最慢 # def func(i): # i+=1 # print(i) # return i # # if __name__ == '__main__': # p=Pool(9) # res=p.map(func,[i for i in range(20)]) # p.close()#保证不再传进程 # p.join()#先执行子进程 # print(res) #apply应用:同步处理,速度稍微慢,进程全为普通进程 # apply(func,args=()): 同步的效率,也就是说池中的进程一个一个的去执行任务 # func:进程池中的进程执行的任务函数 # args: 可迭代对象型的参数,是传给任务函数的参数 # 同步处理任务时,不需要close和join # 同步处理任务时,进程池中的所有进程是普通进程(主进程需要等待其执行结束) # def func(i): # i+=1 # return i # # if __name__ == '__main__': # p=Pool(9) # for i in range(20): # res=p.apply(func,args=(i,)) # print(res)#不需要close()和join() #apply_async应用:异步处理,速度最快,进程为守护进程 # apply_async(func,args=(),callback=None): 异步的效率,也就是说池中的进程一次性都去执行任务 # func:进程池中的进程执行的任务函数 # args: 可迭代对象型的参数,是传给任务函数的参数 # callback: 回调函数,就是说每当进程池中有进程处理完任务了,返回的结果可以交给回调函数,由回调函数进行进一步的处理,回调函数只有异步才有,同步是没有的 # 异步处理任务时,进程池中的所有进程是守护进程(主进程代码执行完毕守护进程就结束) # 异步处理任务时,必须要加上close和join def func(i): i+=1 # print(i) return i if __name__ == '__main__': p=Pool(9) l=[] for i in range(20): res=p.apply_async(func,args=(i,)) l.append(res) [print(i.get())for i in l] p.close()#保证不再传进程 p.join()#先执行子进程