絶対にありません。
それは2つのスレッドが次のいずれかを実行する前に、この行を実行することは十分に可能である。その後
if set_this_var_only_once is None:
、両方のスレッドは、次の行を実行します:
set_this_var_only_once = "not None"
をあなたはlocksにを使用することができますそれを防止する:
lock = threading.Lock()
def worker():
lock.acquire()
if set_this_var_only_once is None:
set_this_var_only_once = "not None"
lock.release()
1つのスレッドだけが可能ですを取得します。ロックを取得します。別のスレッドがロックされている間に別のスレッドがロックを取得しようとすると、lock.acquire()
の呼び出しはブロックされ、ロックがに解放されて最初のスレッドによってに解放されるまで待機します。次に、他のスレッドによってロックが取得されます。
このようにして、コードはlock.acquire()
とlock.release()
の間で一度に1つのスレッドで確実に実行されます。
EDIT
ゲルハルトはthe other answerで指摘したように、あなたがロックしてcontext management protocolを使用することができますに:
with lock:
if set_this_var_only_once is None:
set_this_var_only_once = "not None"
もロックが正しくロックされた範囲内の例外の場合には解放されていることを確認しますブロック。
は、それらのいずれかは、変数を設定する前に何? –
私の心配であるマシン工学 – ealeon