WindowsとLinux(両方python2.7付き)、Windows上でmultiprocessing.Processは、グローバルオブジェクトと関数の引数
'''import_mock.py'''
to_mock = None
'''test.py'''
import import_mock
from multiprocessing import Process
class A(object):
def __init__(self):
self.a = 1
self.b = 2
self.c = 3
def __getstate__(self):
print '__getstate__'
return { 'a': self.a, 'b': self.b,
'c':0 }
def func():
import_mock.to_mock = 1
a = A()
return a
def func1(a):
print a.a, a.b, a.c
print import_mock.to_mock
if __name__ == '__main__':
a = func()
p = Process(target=func1, args=(a,))
p.start()
p.join()
上で実行されている場合は、次のコードは、異なる出力を持っているため、WindowsおよびLinux上で異なる動作をする理由、出力は次のようになります。
に私が期待したものある
__getstate__
1 2 0
None
それはグローバルオブジェクトと渡されたargをクローンしません。
私の質問は、彼らの行動が違う理由ですか?そして、LinuxコードをWindowsと同じように動作させる方法は?
物事は2つのOSで異なって実装されているためです。 Windows上では、子プロセスがそれらを使用できるように、マルチプロセッシングの多くのタイプをpicklableにする必要があることがドキュメントに記載されています。その意味は、他のOSではそうである必要はないということです。 'multiprocessing'モジュールのドキュメントにログインする際の[このセクション](https://docs.python.org/2/library/multiprocessing.html#logging)は、あなたの特定の問題に役立つかもしれません。 – martineau