2017-02-09 11 views
3

このコードはLinux上で実行されるが、はAttributeErrorをスロー:型オブジェクト「T」を、なぜ、窓には属性「val」を持っていませんか?PythonのマルチプロセッシングLinuxの窓差

from multiprocessing import Process 
import sys 

class T(): 
    @classmethod 
    def init(cls, val): 
     cls.val = val 

def f(): 
    print(T.val) 

if __name__ == '__main__': 
    T.init(5) 

    f() 

    p = Process(target=f, args=()) 
    p.start() 

答えて

2

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で詳述されているすべてのそれらのマルチプロセッシングを使用して他の癖があります。

+0

'fork'と' spawn'は非常に古い議論です。 NTカーネルは常に書き込み時コピーを実行できますが、MS-DOSから出てくるWindows API自体は許可しません。また、マルチスレッドプロセスをフォークする際には問題はありません。その場合、Python 3.4では、 "fork"に加えて "forkserver"と "spawn"という2つの起動オプションが用意されています。後者はWindowsの唯一のオプションです。 – eryksun

+1

それは確かです。私はいつも、NTカーネルに根本的な機能が存在するにもかかわらず、Win32では利用可能な奇数のフォークシステムコールが見つからなかった。マイクロソフトが古いものに譲るのを嫌っているのを見て助けてはいけません。「Unixを理解していない人は、それを改革すると非難されます。彼らはW2K8まで待ってからシンボリックリンクを追加しました。私は 'fork()'が将来のいくつかのWindows版に相当することを賭ける準備ができています。ただ時間を与えてください。おそらく 'DuplicateCurrentProcess'のような名前であるでしょう。 – spectras

+0

DOSで実行されているWindows 2.0からシステムが進化する方法は、少なくともアクティブなプロセスではなく、 'fork'では機能しません。カーネルモードのWindows(win32k.sys)は、NTの 'EPROCESS'と' ETHREAD'構造を 'fork'がデッドロックのような問題になるように拡張します。 OTOHでは、プロセスを分析するために不活性な[スナップショット](https://msdn.microsoft.com/en-us/library/dn457825)をフォークする機能があります。 – eryksun

関連する問題