6

wsgi を書いたとしますapplication。このアプリケーションApache2Linuxマルチスレッド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

これから導き出されるより多くの理論的な質問:

  1. 同じプロセス内の同時スレッドが同じa変数にアクセスして変更するため、私の例はスレッドセーフではありませんか?
  2. 私のWebApacheサーバーpthreadspthread. それとも、Apache はこのエラーから私を保護してくれますか?
  3. Tornadoのようなpythonで書かれたWebサーバーでこれを実行していたらどうなりますHTTPServerか?Python で記述された Web サーバーは、スレッドを Python レベルのthreading.Threadオブジェクトとして実装applicationし、各スレッドで関数を実行します。それで、それは競合状態だと思いますか?(また、この場合、実装の下の基礎となる C レベルから抽象化して、python 関数だけを心配することができると思いますpthreadsthreading.Threadインタープリターは、C レベルの共有データを変更してその機能を台無しにすることを許可しないためです。したがって、私にとってスレッドセーフを破るのは、グローバル変数を扱うことですか?そうですか?)
4

2 に答える 2