队列的使用

排队打算如何使用?我在Python中找到了以下代码
手册,但我不明白如何阻止消费者在所有项目之后
已经生产了.我尝试了不同的方法,但所有方法
似乎不正确(种族,僵局或重复队列功能)
def worker():
而真:
项目= q.get()
do_work(项目)
q.task_done()
q = queue()
对于我在范围内(num_worker_threads):
t =线程(目标=工人)
t.setdaemon(true)
t.start()
对于源()中的项目:
Q.PUT(项目)
q.join()#块,直到完成所有任务

# 回答1


Alexandru Mosoi写道:
将哨兵放入队列中,该队列被解释为"终止"
工作人员.当然,您需要为每个工人放入一次.
diez
# 回答2


Alexandru Mosoi写道:
如果项目没有:
休息
#停止所有消费者
对于我在范围内(num_worker_threads):
Q.PUT(无)
这就是我的方式.
-Gerhard
# 回答3


DieZput哨兵进入队列,被解释为"终止"
为工人而死.当然,您需要将其放入一次
Diezeach工人.
或使消费者守护程序线程使生产者完成后
所有非daemon线程退出,消费者也这样做.
跳过
# 回答4


跳过使消费者守护程序的线程,以便当生产者
Skipare完成了所有非daemon线程的出口,消费者会做
Skipwell.
忘了我写这篇文章.如果他们碰巧在代币上工作
在其他线程退出时食用,它们也将.使用
Sentinel代币的想法.
跳过
# 回答5


8月27日,1:06*PM,GerhardHäring * * * * * * * *如果项目无:
* * * * * * * * * *休息
#停止所有消费者
对于我在范围内(num_worker_threads):
* * * q.put(无)
这就是我的方式.
- 格哈德

假设您知道多少个消费者线程,您的解决方案有效
你有 :).我不 :).不仅如此,如果您有
多个生产者:).有哨兵是我的第一个想法,
但是如您所见,这是一个种族条件(有些情况下没有
所有项目均已处理).

# 回答6


假设您知道多少个消费者线程,您的解决方案有效
当没有项目中没有项目时,队列会提出一个空的例外
队列.将q.get()调用在尝试块中,然后退出.
堵塞.
您也可以使用条件变量来发出信号线程终止.
# 回答7


8月27日,2:54*PM,Jeff 错误的.如果生产商花了很长时间才能生产商品怎么办?
消费者
会找到空空的队列而不是等待.
这是我要避免的解决方案,因为它重复了队列
功能.
我更喜欢使用精美设计的干净解决方案而不是黑客队列
班级.
# 回答8


8月27日,12:45*PM,Alexandru Mosoi 好的.我想我想了:).让我知道你的想法
全局num_tasks,num_done,队列
num_tasks = 0
num_done = 0
queu e = queue()
#制片人
num_tasks += 1
我在项目中:
num_tasks += 1
queue.put(i)
num_tasks- = 1
如果num_tasks == num_done:
queue.put(无)
# 消费者
而真:
i = queue.get()
如果我没有:
queue.put(无)
休息
# 做东西
num_done += 1
如果num_done == num_tasks:
queue.put(无)
休息
# 回答9


>
如果您有几个生产商,如何协调何时关闭?
除此之外,您可以轻松地解决不知道多少
您拥有的消费者通过将哨兵的消费者放回到
队列.然后,它将涟漪向下,直到没有消费者.
diez
# 回答10


8月27日,下午1:17,Alexandru Mosoi 好的.我想我想了:).让我知道你的想法
全局num_tasks,num_done,队列
num_tasks = 0
num_done = 0
队列= queue()
#制片人
num_tasks += 1
我在项目中:
num_tasks += 1
queue.put(i)
num_tasks- = 1
如果num_tasks == num_done:
queue.put(无)
# 消费者
而真:
i = queue.get()
如果我没有:
queue.put(无)
休息
# 做东西
num_done += 1
如果num_done == num_tasks:
queue.put(无)
休息
您确定要将最终退出代码放入消费者中吗?
生产者不应该在队列中不将其放在队列上吗
完成的?您拥有它的方式,生产者可以制作1个项目
可能会被消费,消费者在生产者制造之前退出
项目2.
iain
# 回答11


Alexandru Mosoi写道:
好的.我想我想了:).让我知道你的想法
全局num_tasks,num_done,队列
num_tasks = 0
num_done = 0
队列= queue()
#制片人
num_tasks += 1
我在项目中:
num_tasks += 1
queue.put(i)
如果要使用螺纹安全队列有什么意义
非线程安全柜台?如果您想编写破碎的代码,可以做
在较少的行中;-)
正如其他人提到的那样,您可以使用前哨:http://effbot.org/librarybook/queue.htm
或者,在Python 2.5及以后,task_done/JOIN模式在此处显示:http://docs.python.org/lib/queueobjects.html
# 回答12

skge@pobox.com写道:
消费者应该如何知道生产者何时是
完成的?是的,有不同的方法,例如前哨,但是
图书馆中内置的统一方法确实确实确实确实确实如此
像图书馆中的不足.
# 回答13


8月27日,4:55*PM,Paul Rubin 消费者应该如何知道生产者何时是
完成的? *是的,有不同的方法,例如前哨,但是
图书馆中内置的统一方法确实确实确实确实确实如此
像图书馆中的不足.
请参阅Effbot的答复. Task_done和Join方法被放在那里
正是此用例.
雷蒙德

标签: python

添加新评论