队列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')
复制代码

 

posted @   咕咚!  阅读(7403)  评论(1编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示