wsgi を書いたとしますapplication
。このアプリケーションApache2
をLinux
マルチスレッドmod-wsgi
構成で実行して、アプリケーションが単一のプロセスごとに多くのスレッドで実行されるようにします。
WSGIDaemonProcess mysite processes=3 threads=2 display-name=mod_wsgi
WSGIProcessGroup mysite
WSGIScriptAlias / /some/path/wsgi.py
アプリケーションコードは次のとおりです。
def application(environ, start_response):
from foo import racer
status = '200 OK'
response_headers = [('Content-type', 'text/plain')]
start_response(status, response_headers)
return [racer()] #call to racer creates a race condition?
モジュール foo.py:
a = 1
def racer():
global a
a = a + 1
return str(a)
variable で競合状態を作成しましたa
か? 私は、スレッド間で存在し、同じ(共有されている)a
モジュールレベルの変数だと思いますか?foo.py
これから導き出されるより多くの理論的な質問:
- 同じプロセス内の同時スレッドが同じ
a
変数にアクセスして変更するため、私の例はスレッドセーフではありませんか? - 私のWeb
Apache
サーバーpthreads
がpthread
. それとも、Apache はこのエラーから私を保護してくれますか? Tornado
のようなpythonで書かれたWebサーバーでこれを実行していたらどうなりますHTTPServer
か?Python で記述された Web サーバーは、スレッドを Python レベルのthreading.Thread
オブジェクトとして実装application
し、各スレッドで関数を実行します。それで、それは競合状態だと思いますか?(また、この場合、実装の下の基礎となる C レベルから抽象化して、python 関数だけを心配することができると思いますpthreads
。threading.Thread
インタープリターは、C レベルの共有データを変更してその機能を台無しにすることを許可しないためです。したがって、私にとってスレッドセーフを破るのは、グローバル変数を扱うことですか?そうですか?)