でグローバル変数にアクセスできません。値は変更されずにFirst
のままです。ここ が出力されます:pは新しいプロセス、ない新しいスレッドあるのでは、下のコードでのpython
hello
before: First
after: First
でグローバル変数にアクセスできません。値は変更されずにFirst
のままです。ここ が出力されます:pは新しいプロセス、ない新しいスレッドあるのでは、下のコードでのpython
hello
before: First
after: First
あなたが見ている動作です。新しいプロセスを生成すると、初期プロセスの状態を完全にコピーしてから、並列実行を開始します。スレッドを生成すると、最初のスレッドとメモリが共有されます。
プロセスはメモリ分離を持つため、共有メモリへの読み書きによって競合条件エラーが発生することはありません。しかし、子プロセスのデータを親プロセスに戻すには、パイプのようなプロセス間通信の何らかの形式を使用する必要があります。また、メモリを使用するため、生成するコストが高くなります。いつものようにコンピュータサイエンスでは、トレードオフをしなければなりません。詳細については
、以下を参照してください
をあなたが実際に代わりにスレッドを使用することを検討して、達成しようとしているものに基づいています。
グローバル状態は共有されていないため、子プロセスによる変更は無効です。
実際にそれが唯一の生み出し プロセスのグローバル変数を変更しない:ここで
が理由です。プロセス内でアクセスする場合は、それを見ることができます。 そのプロセスでは、グローバル変数環境は初期化されますが、 の変更はプロセス自体に限定され、 は全体ではありません。
このを試してみてください
from multiprocessing import Process
import os
from time import sleep as delay
test = "First"
def f2():
print ("f2:" + test)
def f():
global test
print ('hello')
print ("before: "+test)
test = "Second"
f2()
if __name__ == '__main__':
p = Process(target=f, args=())
p.start()
p.join()
delay(1)
print("after: "+test)
が起こっていただきました!あなたは本当にそれはあなたを助けるかもしれないこのdocまたはpostを読んで、それを行うための別の方法は、自分のプロセスからの変更を使用する必要がある場合には説明しています。