【操作系统实验】python代码模拟实现生产者消费者模式

相比C/C++指针的折磨,本人更喜欢python代码的简洁,废话不多说:

from multiprocessing import Process, JoinableQueue
import time, random, os

def consumer(q):
	while True:
		res = q.get()
		time.sleep(random.randint(1, 3))
		print('%s 吃 %s' % (os.getpid(), res))

		q.task_done()  # 向q.join()发送一次信号,证明一个数据已经被取走了

def producer(name, q):
	for i in range(10):
		time.sleep(random.randint(1, 3))
		res = '%s%s' % (name, i)
		q.put(res)
		print('%s 生产了 %s' % (os.getpid(), res))
	q.join()

if __name__ == '__main__':
	q = JoinableQueue()  # 类似Queue队列  多了task
	# 生产者们:即厨师们
	p1 = Process(target=producer, args=('~~鱼香鸡蛋~~', q))
	p2 = Process(target=producer, args=('~~麻辣豆腐~~', q))
	p3 = Process(target=producer, args=('~~土豆炒肉~~', q))

	# 消费者们:即吃货们
	c1 = Process(target=consumer, args=(q,))
	c2 = Process(target=consumer, args=(q,))
	c1.daemon = True  # c1 c2 设置为守护进程
	c2.daemon = True

	# 开始
	p_l = [p1, p2, p3, c1, c2]
	for p in p_l:
		p.start()

	p1.join()
	p2.join()
	p3.join()
	print('主')

# 主进程等--->p1,p2,p3等---->c1,c2
# p1,p2,p3结束了,证明c1,c2肯定全都收完了p1,p2,p3发到队列的数据
# 因而c1,c2也没有存在的价值了,应该随着主进程的结束而结束,所以设置成守护进程

【操作系统实验】python代码模拟实现生产者消费者模式_第1张图片

你可能感兴趣的:(Python)