Windowsは、現在のプロセスを複製fork()
システムコールを、欠けています。これには、windows multiprocessingドキュメントページに記載されているものを含め、多くの意味があります。具体的には:内部で
Bear in mind that if code run in a child process tries to access a global variable, then the value it sees (if any) may not be the same as the value in the parent process at the time that Process.start was called.
、Pythonはゼロから新しいプロセスを開始し、再度すべてのモジュールをロードするために、それを伝えることにより、Windows上で新しいプロセスを作成します。現在のプロセスで行った変更は見られません。あなたの例では
が、これは、子プロセスでは、あなたのモジュールがロードされますが、if __name__ == '__main__'
セクションが実行されないことを意味します。したがってT.init
は呼び出されず、T.val
は存在しません。したがって、表示されるエラーです。 POSIXシステムの一方
、(それは、Linuxを含む)、プロセスの作成は、フォークを使用し、すべてのグローバル状態が放置されています。子はすべてのコピーで実行されるので、何かをリロードする必要はなく、T
のコピーとval
のコピーが表示されます。
これはまた、プロセスの作成が「重複」は、実際にデータをコピーするオーバーヘッドを回避するために、コピーオンライトを使用し、特にとして、POSIXシステム上のリソースにより速く、非常に軽量であることを意味しています。
はpython multiprocessing guidelinesで詳述されているすべてのそれらのマルチプロセッシングを使用して他の癖があります。
'fork'と' spawn'は非常に古い議論です。 NTカーネルは常に書き込み時コピーを実行できますが、MS-DOSから出てくるWindows API自体は許可しません。また、マルチスレッドプロセスをフォークする際には問題はありません。その場合、Python 3.4では、 "fork"に加えて "forkserver"と "spawn"という2つの起動オプションが用意されています。後者はWindowsの唯一のオプションです。 – eryksun
それは確かです。私はいつも、NTカーネルに根本的な機能が存在するにもかかわらず、Win32では利用可能な奇数のフォークシステムコールが見つからなかった。マイクロソフトが古いものに譲るのを嫌っているのを見て助けてはいけません。「Unixを理解していない人は、それを改革すると非難されます。彼らはW2K8まで待ってからシンボリックリンクを追加しました。私は 'fork()'が将来のいくつかのWindows版に相当することを賭ける準備ができています。ただ時間を与えてください。おそらく 'DuplicateCurrentProcess'のような名前であるでしょう。 – spectras
DOSで実行されているWindows 2.0からシステムが進化する方法は、少なくともアクティブなプロセスではなく、 'fork'では機能しません。カーネルモードのWindows(win32k.sys)は、NTの 'EPROCESS'と' ETHREAD'構造を 'fork'がデッドロックのような問題になるように拡張します。 OTOHでは、プロセスを分析するために不活性な[スナップショット](https://msdn.microsoft.com/en-us/library/dn457825)をフォークする機能があります。 – eryksun