队列和进程间通信
队列是一种数据结构,他的特点是FIFO(First In First Out),即先进先出,后进后出;这个特点就很适合消息传递,先发出的消息可以最先得到接收,保证通信的即时性,有效性。
代码|注释
from multiprocessing import Process,Queue
from time import sleep
def eatBread(q,name,breadNum,speed): #参赛者:吃面包函数(只管吃面包)
for i in range(breadNum):
sleep(speed) #吃面包需要时间(模拟)
print("{}吃了一个面包".format(name))
q.put(1) #吃过一个就进队列一个1,传出信息
def celebrateAndCout(q,name): #裁判或一旁加油庆祝的人:庆祝和计数函数
num = 0
while True:
try:
num += q.get(timeout = 5) #接收消息,没有消息就会在这儿阻塞
if num%2 == 0:
print("celebrate:{}吃完了第{}个面包,继续加油哦!".format(name,num))
else:
print("celebrate:{}吃完了第{}个面包,真棒!".format(name,num))
except:
print("celebrate:{}总共吃完了{}个面包,他赢了!".format(name,num))
break
if __name__ == '__main__':
name = input("请输入参赛者姓名:")
breadNum = eval(input("参赛最多能吃几个面包:"))
speed = eval(input("参赛者多少秒吃一个面包:"))
q = Queue(30) #定义一个容量为30的队列
p1 = Process(target = eatBread,args=(q,name,breadNum,speed)) #创建进程对象1
p2 = Process(target = celebrateAndCout,args=(q,name)) #创建进程对象2
p1.start() #开始进程1
p2.start() #马上开始进程2
p1.join()
p2.join()