IPC(Inter-Process Communication)
队列:
队列是进程安全的:同时只能被一个进程取值
q = Queue(5)
q.put()
q.full()
q.get() # 无值阻塞
q.empty() # 如果其他进程正在添加项目,那么结果不准确
q.get_nowait() # 无值报错
import time
import random
from multiprocessing import Process,Queue
def consumer(q,name):
while True:
food = q.get()
if food is None:
print('%s啥也没拿到'%name)
break
print('%s吃了%s'%(name,food))
time.sleep(random.randint(1,3))
def producer(name,food,q):
for i in range(4):
time.sleep(random.randint(1,3))
print('%s生产了%s'%(name,food))
q.put(food)
if __name__ == '__main__':
q = Queue(20)
p1 = Process(target=producer,args=('汤姆','包子',q))
p2 = Process(target=producer, args=('杰瑞','沙琪玛',q))
c1 = Process(target=consumer,args=(q,'狗狗'))
c2 = Process(target=consumer, args=(q, '小鸟'))
p1.start()
p2.start()
c1.start()
c2.start()
p1.join()
p2.join()
q.put(None)
q.put(None)
################################################
JoinableQueue
多了
q.join(),
q.task_done()
方法
import time
import random
from multiprocessing import Process,JoinableQueue
def consumer(q,name):
while True:
food = q.get()
print('%s吃了%s'%(name,food))
time.sleep(random.randint(1,3))
q.task_done()
def producer(name,food,q):
for i in range(4):
time.sleep(random.randint(1,3))
print('%s生产了%s%s'%(name,food,i))
q.put(food)
q.join()
if __name__ == '__main__':
q = JoinableQueue(20)
p1 = Process(target=producer,args=('汤姆','包子',q))
p2 = Process(target=producer, args=('杰瑞','沙琪玛',q))
c1 = Process(target=consumer,args=(q,'狗狗'))
c2 = Process(target=consumer, args=(q, '小鸟'))
p1.start()
p2.start()
c1.daemon = True
c2.daemon = True
c1.start()
c2.start()
p1.join()
p2.join()