0

これは高度な質問ですが、単純に見えます。コードを参照してください (http ハンドラー呼び出しごとに増加する 1 つのグローバル変数)。

some_global_var = 0

class DebugCgiHandler(webapp.RequestHandler):
  def get(self):
    some_global_var++
    self.response.out.write(some_global_var)

Q1. 問題は、単一スレッド モードの Python 2.5 および Python 2.7 で変数が 1 に設定され、同時呼び出しが別の要求で発生した場合にどうなるかということですself.response.out.write(some_global_var)。1 番目のリクエストと 2 番目のリクエストには何が表示されますか?


Q2. 2 番目の質問は、Python 2.7 をマルチスレッド モードで実行すると、同じ状況で何が起こるかということです。


Q3. 他のスレッドから保護された最後まで同じ値を維持するために、リクエスト処理全体で変数の変更を回避するにはどうすればよいですか?

4

1 に答える 1

4

Q1: シングル スレッド モードでは、同時要求呼び出しが発生しないため、スレッド セーフについて心配する必要はありません。

Q2: マルチスレッドをオンにすると、異なるスレッドが some_global_var をインクリメントして異なるタイミングで表示する可能性があるため、予期しない動作が発生する可能性があります。たとえば、タイミングが特定の方法で発生する場合、some_global_var は 1 回だけインクリメントされる可能性があります。

Q3: threading.Lock() を使用する

どのような結果が得られるかについてはまだ答えていません。App Engine では、この質問はそのままでは成り立たないからです。some_global_var は特定のインスタンスで「グローバル」になりますが、リクエストがどのインスタンスに送信されるかを制御することはできません。そのため、シングル スレッド環境であっても、2 つのリクエストが 2 つの別々のインスタンスにヒットする場合があります。その場合、両方のリクエストに対して 1 が表示されます。または、同じインスタンスにヒットする可能性があり、2 が表示されます。スレッドの問題はその上に適用されます。

于 2013-02-28T00:23:05.700 に答える