7

Unterstanding eventlet.wsgi.serverからサンプル コードを取得しました。

from eventlet import wsgi
import eventlet
from eventlet.green import time
import threading

def hello_world(env, start_response):
    print "got request", eventlet.greenthread.getcurrent(), threading.currentThread()
    time.sleep(10)
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return ['Hello, World!\n']

wsgi.server(eventlet.listen(('', 8090)), hello_world)

異なるクライアント IP アドレスを介して Web サーバーにアクセスすると、それらが並行して処理されていることがわかります。また、印刷をhello_world使用すると、それらが 2 つの異なるグリーンスレッドで処理されているが、同じ OS スレッドで処理されていることもわかります。

私はPythonが初めてです。各グリーンスレッドが基礎となる OS スレッドに関連付けられているかどうかに興味がありますか?

4

1 に答える 1

6

各緑色のスレッドは、正確に 1 つの OS スレッドに関連付けられている正確に 1 つの Python スレッドに関連付けられています。理論的には、Eventlet は複数の Python スレッド、ひいては OS スレッドにグリーン スレッドを分散させることができますが、 CPythonでは Python コードが並列に実行されないため、これは多くの作業であり、メリットはほとんどありません [1]。

経験則: 複数のコアを使用する場合は、他の言語を選択Python では、いくつかのプロセスを実行するのが最善の策です。クイックな方法はmultiprocessing[2] (2.6 以降の stdlib)、堅牢な方法はos.fork[3][4] 手動です。

用語 について簡単に説明します。ほとんどの一般的なオペレーティング システムでは、コードを並行して実行する唯一の方法は、複数の OS スレッドを使用することです。厳密に言えば、リクエストは並列ではなく同時に処理されます。OS スレッドが 1 つしかないからです。任意の時点で、何らかのコードを実行するグ​​リーン スレッドは 1 つだけです。ちなみに、同じ制限が通常の Python スレッドにも適用されます。そのため、Eventlet (またはその他のグリーン スレッド ライブラリ) はほとんどの場合、ドロップインの置き換えとして機能し、(ほとんどの場合) 新しい異常なバグは発生しません。

この回答が役に立つかもしれません: https://stackoverflow.com/posts/14227272/revisions

[1] http://wiki.python.org/moin/GlobalInterpreterLock
[2] http://docs.python.org/2/library/multiprocessing.html
[3] http://docs.python.org/2 /library/os.html#os.fork
[4] https://github.com/jonashaag/bjoern/blob/master/tests/fork.py

于 2013-03-09T13:13:52.117 に答える