Python 3.x 如何使生成器提前准备下一个值?

Python 3.x 如何使生成器提前准备下一个值?,python-3.x,generator,yield,Python 3.x,Generator,Yield,我有一个生成器,它循环遍历大量元素列表,并生成满足特定条件的元素。处理单个元素可能需要一些时间。一旦我产生了那个元素,在我的主函数中再次需要一段时间来处理它 这意味着,当我在生成器中循环时,我必须等待生成器找到满足所有条件的元素,然后让我的主要功能处理它,然后冲洗并重复。我希望在需要时尽快提供下一个值,从而加快速度 def generate(a, b): for stack in some_function(a, b): # Check for multiple cond

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

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

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
时准备就绪?这可能是开箱即用的吗?我已经研究过协程和并发,但它们似乎与我的问题无关。

这是我提出的解决方案:

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循环仍然运行,因为线程仍然处于活动状态。如果线程处于死状态,那么只要队列为空,循环就会运行。这显然是一种解决方法,因为生成不再是生成器,但它确实起到了作用。

除非在生成当前生成器之前找到下一个生成器,否则无法生成。这段时间必须花在某个地方。@jonrsharpe难道没有办法将生成器放在一个单独的线程中,以便它在后台运行吗?我刚刚遇到了一个似乎相关的问题。我必须查看GIL,看看是否可以使用类似的技术。