队列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 @ 2018-08-01 11:43  咕咚!  阅读(7401)  评论(1编辑  收藏  举报