我现在在Python 2.7中使用多处理和队列,并尝试使用变量p打印0到7。当while
用作选项1中显示的注释代码时,它可以正常工作。但是,当使用for
和iter()
时,如选项2所示,0到7会打印,但程序永远不会退出循环,我必须手动退出。关于如何修改代码以便在打印后正常退出循环的任何建议?使用iter()
,有没有办法为输入arg block=False
设置p.get
?
def try_queue():
q = Queue()
for i in range(10):
q.put(i)
p = Queue()
for j in iter(q.get,8):
p.put(j)
# option 1, use while, works.
# while not p.empty():
# print(p.get())
# option 2, use iter()
for k in iter(p.get, None): # None is the sentinel here
print(k)
try_queue()
答案 0 :(得分:0)
您无法轻易实现这一点,因为Queue
不支持iterator protocol。原因是Queue
被设计为消息传递对象而不是容器。
Queue.get
方法无法确保Queue
为actually empty。因此,在编写逻辑时请记住这一点:这不是Queue
打算使用的方式。把它想象成一种" socket"线程/进程之间。
以下是实现目标的两种方法。
1)创建一个支持迭代器协议的IterQueue
类。
from Queue import Queue
class IterQueue(Queue):
"""Queue supporting iterator protocol."""
def __iter__(self):
return self
def next(self):
if self.empty():
raise StopIteration()
return self.get()
queue = IterQueue()
for element in queue:
print element
2)将get调用包装到生成器中。这在技术上隐藏了逻辑中的while循环。
def get_next_element(queue):
while not queue.empty():
yield queue.get()
for element in get_next_element(queue):
print element