队列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方法的主要内容,如果未能解决你的问题,请参考以下文章

来自dispatch_async全局崩溃的C函数调用,但在主队列上工作

队列queue 代码

简单介绍一下python Queue中常用的方法

队列实现

线程-队列

线程-队列