进程之间的通信及进程池
Posted zhigu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程之间的通信及进程池相关的知识,希望对你有一定的参考价值。
队列
q.put(item):放值,将item放入队列。如果队列已满,此方法将阻塞至有空间可用为止
q.get():取值,返回q中的一个项目。如果q为空,此方法将阻塞,直到队列中有项目可用为止
q.get_nowait()
q.put_nowait()
q.empty(): 判断队列是否为空,不可靠
q.full():判断队列是否满,不可靠
q.close():关闭队列
1 from multiprocessing import Process,Queue 2 3 def consume(q): 4 print(‘son-->‘, q.get()) #取值 5 q.put(‘abc‘) #放值 6 7 if __name__ == ‘__main__‘: 8 q = Queue() 9 p = Process(target=consume, args=(q,)) 10 p.start() 11 q.put({‘123‘:123}) #放值 12 p.join() #阻塞,等子进程结束再继续执行 13 print(‘Foo-->‘, q.get()) #取值 14 #son--> {‘123‘: 123} 15 #Foo--> abc
生产者消费模型
1 import time 2 import random 3 from multiprocessing import Process, Queue 4 5 def consumer(q, name): 6 while True: 7 food = q.get() #从队列中得到吃的 8 if food is None:break #没有吃的就退出 9 time.sleep(random.uniform(0.5, 1)) #吃的时间 10 print(‘%s吃了一个%s‘ % (name, food)) 11 12 def producer(q, name, food): 13 for i in range(10): #生产多少个吃的 14 time.sleep(random.uniform(0.3, 0.8)) #生产时间 15 print(‘%s生产了第%s个%s‘ % (name, i, food)) 16 q.put(food+str(i)) #把第几个吃的放到队列里 17 18 if __name__ == ‘__main__‘: 19 q = Queue() 20 c1 = Process(target=consumer, args=(q, ‘小明‘)) 21 c2 = Process(target=consumer, args=(q, ‘小灰‘)) 22 c1.start() 23 c2.start() 24 p1 = Process(target=producer, args=(q, ‘小明他爸‘, ‘大嘴巴子‘)) 25 p2 = Process(target=producer, args=(q, ‘小灰他妈‘, ‘大耳刮子‘)) 26 p1.start() 27 p2.start() 28 p1.join() 29 p2.join() #生产完毕后再继续向下执行,等他们吃完再手动放置None 30 q.put(None) #有几个consumer就放置几个None 31 q.put(None)
以上是关于进程之间的通信及进程池的主要内容,如果未能解决你的问题,请参考以下文章
第35篇 进程之间的通信 Queue Pipe 进程池Pool,p.apply()方法,p.apply_async()方法