我有三个不同的生成器,它们从网络生成数据。因此,每次迭代可能需要一段时间才能完成。
我想混合对生成器的调用,并考虑轮询(在此处找到)。问题是每个呼叫都被阻止,直到它完成。
有没有办法同时循环所有的生成器而不阻塞?
你可以用iter()
我ThreadPool
课堂上的方法来做到这一点。
pool.iter()
产生线程函数返回值,直到所有修饰+调用的函数完成执行。装饰所有异步函数,调用它们,然后循环pool.iter()
以捕获发生的值。
例子:
import time
from threadpool import ThreadPool
pool = ThreadPool(max_threads=25, catch_returns=True)
# decorate any functions you need to aggregate
# if you're pulling a function from an outside source
# you can still say 'func = pool(func)' or 'pool(func)()
@pool
def data(ID, start):
for i in xrange(start, start+4):
yield ID, i
time.sleep(1)
# each of these calls will spawn a thread and return immediately
# make sure you do either pool.finish() or pool.iter()
# otherwise your program will exit before the threads finish
data("generator 1", 5)
data("generator 2", 10)
data("generator 3", 64)
for value in pool.iter():
# this will print the generators' return values as they yield
print value
简而言之,不:没有线程就没有好方法。
有时 ORM 会增加某种 peek 函数或回调,这些函数会在数据可用时发出信号。否则,您需要生成线程才能执行此操作。如果线程不是一个选项,您可以尝试将数据库库切换为异步库。