我有三个不同的生成器,可以从网络中提取数据。因此,每次迭代可能需要一些时间才能完成。
我希望混合调用这些生成器,考虑使用roundrobin(在这里找到)。 问题是每个调用都会被阻塞,直到它完成为止。
是否有一种方法可以同时循环遍历所有生成器,而不会阻塞?
我希望混合调用这些生成器,考虑使用roundrobin(在这里找到)。 问题是每个调用都会被阻塞,直到它完成为止。
是否有一种方法可以同时循环遍历所有生成器,而不会阻塞?
ThreadPool
类的 iter()
方法来实现此操作。
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
pool.iter()
生成器,线程仍然会产生所有数据,而我的生成器非常大(5000+),而我只需要20个结果。 - iTaybitertools.islice
没有被识别为生成器。此外,在每个self.returned调用之间需要一点睡眠,因为如果它们返回得非常快,其中一些将会丢失。这是我对threadpool.ThreadPool.worker
的try块进行修复的版本:http://pastebin.com/inTxx2tB - iTaybself.finish()
可以实现,但是它会阻塞。 - iTayb