2011-07-04 12 views
2

osx上のpython-multiprocessingを使用して、インポート前に新しいプロセス内にモジュールが存在します。ここ
は例です:窓/ Linux上
MAC上のマルチプロセッシング・インポート・モジュール

 

import multiprocessing 
import sys 
import os 

print 'importing module' 
def main(): 
    import uuid 
    print 'setting var' 
    uuid.some_variable = True 

def process(name): 
    print 'uuid module loaded:', 'uuid' in sys.modules 
    print 'process pid', os.getpid() 
    import uuid 
    var = uuid.some_variable 
    print 'var exists on mac', var 

if __name__ == '__main__': 
    print 'main pid', os.getpid() 
    main() 
    p = multiprocessing.Process(target=process, args=('test',)) 
    p.start() 
    p.join() 
 


出力は、私が期待するものです。スクリプトのインポートは二回、uuid.some_variableが存在しない、とUUIDをインポートする前にロードされていません。しかしOSX上で、スクリプトは一度だけインポートします

 
importing module 
main pid 4352 
setting var 
importing module 
uuid module loaded: False 
process pid 4988 
AttributeError: 'module' object has no attribute 'some_variable' 

、UUIDは、インポートする前にロードされ、uuid.some_variableが存在します新しいプロセスで:

 
importing module 
main pid 4399 
setting var 
uuid module loaded: True 
process pid 4400 
var exists on mac True 

どういうわけか、メイン処理からUUIDモジュールは、それをインポートすることなく、サブプロセスに入りました。
何か不足していますか、これはバグですか、これを行うには十分な理由がありますか?
モジュールはどのようにしてサブプロセスに入りましたか?

+0

Arch Linux(Python 3.2では '2to3'を使用した後)でPython 2.7で正確なコードを実行すると、" uuid module loaded:True "と" var exist on mac True "と表示されます。 LinuxとMacOSの両方で、使用しているPythonのバージョンを教えてください。 – Schnouki

+0

@Schnouki:それはすべてPython 2.6です。 Windows 7、Fedora 11、OSX 10.6.6。 あなたが得ている結果は、私が望まないものです。モジュールをインポートするためには、各プロセスが必要です。 –

答えて

1

問題は、マルチプロセスではunixでos.forkを使用することです。したがって、サブプロセスはメインプロセスのコピーになります。 Fedoraで何が起こっているのか知りませんが、Linux上でも動作しません。
簡単に回避する方法はありません。

0

macの実装では、インポートの扱いが異なるようです。それにもかかわらず、あなたが使用して、モジュールの独自のリポジトリを実装することによって、それをハックすることができます

my_modules['context'] = __import__('uuid') 
uuid = my_modules['context'] 
uuid.UUID(...) 

contextがあなたのプロセスの各1です。なぜあなたはこれをやりたいのかわかりませんが、これはうまくいくはずです。

関連する問題