进程之间的通信及进程池

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)
生产者消费模型

 

以上是关于进程之间的通信及进程池的主要内容,如果未能解决你的问题,请参考以下文章

Python进程间通信进程池协程

进程间的通信-队列/管道以及进程间的数据共享和进程池

python基础之进程间通信进程池协程

Python开发基础--- 进程间通信进程池协程

第35篇 进程之间的通信 Queue Pipe 进程池Pool,p.apply()方法,p.apply_async()方法

铁乐学python_Day40_进程池