进程间通信(Inter-Porcess Communication,简称IPC),首先要了解队列,它是先进先出的。通过from multiprocessing import Queue
来使用。
from multiprocessing import Queue
q = Queue(6)
for i in range(6):
q.put(i)
print('%d放入队列'%i)
print('********************************')
while True:
print(q.get())
通过队列,让两个子进程之间进行通信。
from multiprocessing import Queue,Process
def produce(q):
q.put('hello')
def consume(q):
print(q.get())
if __name__ == '__main__':
q = Queue()
p = Process(target=produce,args=(q,))
p.start()
p1 = Process(target=consume,args=(q,))
p1.start()
生产者、消费者模型
一个队列是进程安全的,一个队列中的数据只能被一个进程请求数据。
from multiprocessing import Queue,Process
import time,random
def producer(name,food,q):
for i in range(10):
time.sleep(random.randint(1,3))
f = '%s生产了%s%s'%(name,food,i)
print(f)
q.put(f)
def consumer(q,name):
while True:
food = q.get()
if food is None:
print('获取到一个空')
break
print('%s消费了%s'%(name,food))
time.sleep(random.randint(1,3))
if __name__ == '__main__':
q = Queue()
p1 = Process(target=producer,args=('张三','包子',q))
p2 = Process(target=producer,args=('李四','胡辣汤',q))
c1 = Process(target=consumer,args=(q,'王五'))
c2 = Process(target=consumer,args=(q,'yan五'))
p1.start()
p2.start()
c1.start()
c2.start()
p1.join()
p2.join()
q.put(None)
q.put(None)
JoinableQueue
from multiprocessing import JoinableQueue,Process
def producer(name,food,q):
for i in range(10):
time.sleep(random.randint(1,3))
f = '%s生产了%s%s'%(name,food,i)
print(f)
q.put(f)
q.join() #JoinableQueue的join代表阻塞 感知一个队列中的数据全部被执行完毕。
def consumer(q,name):
while True:
food = q.get()
print('%s消费了%s'%(name,food))
time.sleep(random.randint(1,3))
q.task_done() #提交一个回值,对q中的值的个数减一。
if __name__ == '__main__':
q = JoinableQueue()
p1 = Process(target=producer,args=('张三','包子',q))
p2 = Process(target=producer,args=('李四','胡辣汤',q))
c1 = Process(target=consumer,args=(q,'王五'))
c2 = Process(target=consumer,args=(q,'yan五'))
p1.start()
p2.start()
c1.daemon = True #设置为守护进程,主进程代码执行完毕之后,子进程自动结束。
c2.daemon = True
c1.start()
c2.start()
p1.join()
p2.join() #进程的join是感知一个进程的结束
在消费者端:
- 每次获取一个数据,发送一个记号,即:
q.task_done()
,标志一个数据被处理成功。
在生产者端:
-
每生产一个数据,放入到队列中,并对数据做一个数据,当生产者生产完所有的数据,
join
信号已经停止生产数据,却要等待数据被消耗完,当数据都被处理完,join
阻塞结束。 -
consumer中把所有的任务消耗完
-
producer的
join
感知到,阻塞停止 -
所有的producer进程结束
-
主进程中的
p.join
结束 -
主进程中代码结束
-
守护进程(消费者的进程)结束