python学习笔记(57) 进程间通信

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()

猜你喜欢

转载自www.cnblogs.com/farion/p/10010290.html