队列Queue的get方法
Posted linga
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了队列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‘)
以上是关于队列Queue的get方法的主要内容,如果未能解决你的问题,请参考以下文章