数日前にスレッドSO私は複数のHTTPを構造化するためのパラダイムをデザインする手助けについてここでスループットの違いコルーチンを使用して対私は上の質問をした
を要求したシナリオです。私は、マルチプロデューサー、マルチコンシューマーシステムを持っていたいと思います。私のプロデューサーはいくつかのサイトをクロールして掻き集め、見つかったリンクをキューに追加します。私は複数のサイトをクロールするので、私は複数のプロデューサー/クローラーを持っていたいと思います。
コンシューマ/ワーカーはこのキューをフィードフォワードし、これらのリンクにTCP/UDP要求を行い、その結果を私のDjango DBに保存します。また、各キュー項目が互いに完全に独立しているため、複数の作業者が必要です。
人々には、このために、すなわちGeventまたはEventletにコルーチンライブラリを使用することをお勧めします。コルーチンを使ったことは一度もありませんでしたが、プログラミングパラダイムはスレッド型のパラダイムに似ていますが、スレッドは1つだけが積極的に実行されていますが、I/Oコールなどブロックコールが発生するとスタックはメモリ内で、スレッドは何らかの種類のI/O呼び出しを検出するまで引き継ぎます。うまくいけば、私はこの権利を持っていますか?ここに私のSOの記事の1からのコードがあります:sleep
呼び出しが呼び出しをブロックしたときにsleep
イベントが発生しているので
import gevent
from gevent.queue import *
import time
import random
q = JoinableQueue()
workers = []
producers = []
def do_work(wid, value):
gevent.sleep(random.randint(0,2))
print 'Task', value, 'done', wid
def worker(wid):
while True:
item = q.get()
try:
print "Got item %s" % item
do_work(wid, item)
finally:
print "No more items"
q.task_done()
def producer():
while True:
item = random.randint(1, 11)
if item == 10:
print "Signal Received"
return
else:
print "Added item %s" % item
q.put(item)
for i in range(4):
workers.append(gevent.spawn(worker, random.randint(1, 100000)))
# This doesn't work.
for j in range(2):
producers.append(gevent.spawn(producer))
# Uncommenting this makes this script work.
# producer()
q.join()
これはうまく機能し、他の緑のスレッドが処理を引き継ぎます。これは逐次実行よりもはるかに高速です。 ご覧のとおり、私のプログラムには意図的に別のスレッドへのスレッドの実行をもたらすコードはありません。私はすべてのスレッドを同時に実行させたいので、これが上記のシナリオにどのように適合するのか見当たりません。
すべてが正常に動作しますが、私はGevent/Eventletsがオリジナル順次実行中のプログラムよりも高いが、実際のスレッドを使用して達成することができるものよりも大幅に低い使用して達成したスループットを感じます。
私は生産者と消費者のそれぞれが同時にコルーチンのような内外のスタックを交換することなく作業することができ、スレッド化メカニズムを使用して再実装私のプログラムにした場合。
これはスレッドを使用して再実装する必要がありますか?私のデザインは間違っていますか?私はコルーチンを使うことの本当のメリットを見逃しました。
多分私のコンセプトは少し濁っているかもしれませんが、これは私が同化したものです。私のパラダイムと概念の助けや明確化はすばらしいことでしょう。あなたは非常に多くの(緑)のスレッドを持っているとき
おかげ
なぜ複数のプロセスを使用しないのですか? –
マルチスレッドとマルチ処理の長所と短所が分からないので、大丈夫かどうかわかりません。 –
グローバルインタプリタロックのために、C拡張(または重量のあるOSプロセス)に頼ることなく、Pythonプログラムで「本当のスレッディング」(実際のOSスレッドは常に1つだけ実行されます)はありません。 –