3

我有三个不同的生成器,它们从网络生成数据。因此,每次迭代可能需要一段时间才能完成。

我想混合对生成器的调用,并考虑轮询(在此处找到)。问题是每个呼叫都被阻止,直到它完成。

有没有办法同时循环所有的生成器而不阻塞?

4

2 回答 2

5

你可以用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
于 2012-10-15T23:47:51.833 回答
1

简而言之,不:没有线程就没有好方法。

有时 ORM 会增加某种 peek 函数或回调,这些函数会在数据可用时发出信号。否则,您需要生成线程才能执行此操作。如果线程不是一个选项,您可以尝试将数据库库切换为异步库。

于 2012-10-15T23:15:14.640 回答