python循环没有

时间:2017-06-01 17:51:28

标签: python queue multiprocessing

我现在在Python 2.7中使用多处理和队列,并尝试使用变量p打印0到7。当while用作选项1中显示的注释代码时,它可以正常工作。但是,当使用foriter()时,如选项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()

Result of option 1

Result of option 2

1 个答案:

答案 0 :(得分:0)

您无法轻易实现这一点,因为Queue不支持iterator protocol。原因是Queue被设计为消息传递对象而不是容器。

Queue.get方法无法确保Queueactually 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