如何让发电机提前准备下一个值?

时间:2016-07-17 15:45:20

标签: python-3.x generator yield

我有一个生成器,循环遍历大量元素并产生满足特定条件的元素。处理单个元素可能需要一段时间。一旦我产生了那个元素,再次在我的main函数中处理它需要一段时间。

这意味着当我循环生成器时,我必须等待生成器找到满足所有条件的元素,然后我的主要功能处理它,然后冲洗并重复。我想通过在需要时立即提供下一个值来加快速度。

def generate(a, b):
    for stack in some_function(a, b):
        # Check for multiple conditions. This
        # takes a while.
        # I'd like to run this code in the
        # background while I process the
        # previous element down below.
        yield stack

for stack in generate(foo, bar):
    # Process the stack. This can take
    # a while too.

如何让生成器准备下一个值,以便在调用next时准备就绪?开箱即可吗?我已经研究了协同程序和并发性,但它们似乎与我的问题无关。

1 个答案:

答案 0 :(得分:1)

这是我提出的解决方案:

from queue import Queue
from threading import Thread

def generate(a, b, queue):
    for stack in some_function(a, b):
        # Check for multiple conditions.
        queue.put(stack)

queue = Queue()
thread = Thread(target=generate, args=(foo, bar, queue))
thread.start()

while thread.is_alive() or not queue.empty():
    stack = queue.get()
    # Process the stack.

如果堆栈的处理速度快于它们添加到队列中的速度,则while循环仍会运行,因为该线程仍处于活动状态。如果线程已死,则只要队列为空,循环就会运行。这显然是一种解决方法,因为 generate不再是生成器,但它可以解决问题。