队列Queue的get方法
写了一段生产者消费者模型的代码:
1 from time import sleep 2 from random import randint, random 3 from multiprocessing import Process, Queue 4 5 6 def consumer(q, name): 7 while 1: 8 if q.get() == 'stop' and q.qsize() == 0: 9 break 10 food = q.get() 11 print('%s 吃了 %s' % (name, food)) 12 sleep(randint(1, 3)) 13 14 15 def producer(q, name, food): 16 for i in range(10): 17 sleep(random()) 18 foo = food + str(i) 19 print("%s 拉了一坨 %s" % (name, foo)) 20 q.put(foo) 21 22 23 if __name__ == '__main__': 24 q = Queue(10) 25 c = Process(target=consumer, args=(q, "老狗")) 26 c.start() 27 p1 = Process(target=producer, args=(q, '峰哥', '粑粑')) 28 p1.start() 29 p1.join() 30 q.put('stop')
这段代码执行的结果是:
1 峰哥 拉了一坨 粑粑0 2 峰哥 拉了一坨 粑粑1 3 老狗 吃了 粑粑1 4 峰哥 拉了一坨 粑粑2 5 峰哥 拉了一坨 粑粑3 6 峰哥 拉了一坨 粑粑4 7 老狗 吃了 粑粑3 8 峰哥 拉了一坨 粑粑5 9 老狗 吃了 粑粑5 10 峰哥 拉了一坨 粑粑6 11 峰哥 拉了一坨 粑粑7 12 老狗 吃了 粑粑7 13 峰哥 拉了一坨 粑粑8 14 峰哥 拉了一坨 粑粑9 15 老狗 吃了 粑粑9
发现只打印了奇数的产品,排错发现是逻辑出错了,应该先用food先从队列里面get,然后去判断,而上面这段代码的问题出在每次if判断从队列里面拿出来了一个导致的
下面是修改后的代码:
1 from time import sleep 2 from random import randint, random 3 from multiprocessing import Process, Queue 4 5 6 def consumer(q, name): 7 while 1: 8 food = q.get() 9 if food == 'stop': 10 break 11 print('%s 吃了 %s' % (name, food)) 12 sleep(randint(1, 3)) 13 14 15 def producer(q, name, food): 16 for i in range(10): 17 sleep(random()) 18 foo = food + str(i) 19 print("%s 拉了一坨 %s" % (name, foo)) 20 q.put(foo) 21 22 23 if __name__ == '__main__': 24 q = Queue(10) 25 c = Process(target=consumer, args=(q, "老狗")) 26 c.start() 27 p1 = Process(target=producer, args=(q, '峰哥', '粑粑')) 28 p1.start() 29 p1.join() 30 q.put('stop')
作者: 咕咚!
出处: https://www.cnblogs.com/linga/
关于作者:专注虚拟化,运维开发,RPA,Rust,Go,Python!
本文版权归作者和博客园共有,禁止*.csdn.net转载,禁止以盈利为目的的转载,转载文章,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(oldsixa@163.com)咨询.