2013-08-23 9 views
11

Geventにスレッドプールオブジェクトがあることに気付きました。 スレッドプールをいつ使用するのか、通常のプールをいつ使うべきか私に説明する人はいますか? gevent.threadpoolとgevent.poolの違いは何ですか?Geventでスレッドプールを使用する場合

答えて

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 
+0

を表示されます「しかし、私はあなたのコードがACライブラリに多くの時間を費やしている場合、それは持っていると考えています効果なし "あなたは確かですか?あなたはC拡張や 'ctypes'を参照していますか? GILを(手動でCの拡張モジュールで、あるいは 'ctypes'で自動的に)リリースすれば、アプリケーションはThreadPoolから恩恵を受けるでしょうか? – MariusSiuram

+0

はい。 "GILをリリースすれば"正確に。私はすべてのC libaryからそれを理解する時間がありません... – Stephan

関連する問題