Web からデータを生成する 3 つの異なるジェネレーターがあります。したがって、各反復が完了するまでに時間がかかる場合があります。
ジェネレーターへの呼び出しをミックスしたいので、ラウンドロビンについて考えました (ここにあります)。問題は、すべての呼び出しが完了するまでブロックされることです。
ブロックせずに、すべてのジェネレーターを同時にループする方法はありますか?
これは、私のクラスの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は、データが利用可能になったときに通知する、ある種のピーク関数またはコールバックで拡張される場合があります。それ以外の場合は、これを行うためにスレッドを生成する必要があります。スレッドがオプションでない場合は、データベースライブラリを非同期ライブラリに切り替えてみてください。