Geventにスレッドプールオブジェクトがあることに気付きました。 スレッドプールをいつ使用するのか、通常のプールをいつ使うべきか私に説明する人はいますか? gevent.threadpoolとgevent.poolの違いは何ですか?Geventでスレッドプールを使用する場合
11
A
答えて
9
pythonコードを実行すると時間がかかります(秒)とピンクコードのスイープが発生しません。 (ネットワーキングなし)他のすべてのgreenlets/geventジョブは「飢え」し、計算時間がなく、アプリケーションがハングするように見えます。
この「重い」タスクをスレッドプールに入れると、スレッド実行によって他のグリーンレットが飢えていないことが確認されます。しかし、あなたのコードがCライブラリに多くの時間を費やしても効果がないと思う。以下の例は、の例です。この例では、gevent.sleepではなくブロックするtime.sleepを使用しています。
TIP: あなたはちょうどループ内gevent.sleep(0)に置くことができるよりも実行に時間がかかりループを持っている場合。他のすべての牧草地では、実行する機会があります。 gevent .sleepは(0)あなたの低速ループに必ず他のgreenletsが餓死しませんようになりますし、アプリケーションが応答
import time
import gevent
from gevent.threadpool import ThreadPool
pool = ThreadPool(3)
start = time.time()
for _ in xrange(4):
pool.spawn(time.sleep, 1)
gevent.wait()
delay = time.time() - start
print 'Running "time.sleep(1)" 4 times with 3 threads. Should take about 2 seconds: %.3fs' % delay
を表示されます「しかし、私はあなたのコードがACライブラリに多くの時間を費やしている場合、それは持っていると考えています効果なし "あなたは確かですか?あなたはC拡張や 'ctypes'を参照していますか? GILを(手動でCの拡張モジュールで、あるいは 'ctypes'で自動的に)リリースすれば、アプリケーションはThreadPoolから恩恵を受けるでしょうか? – MariusSiuram
はい。 "GILをリリースすれば"正確に。私はすべてのC libaryからそれを理解する時間がありません... – Stephan