2011-07-04 7 views
2

모듈은 가져 오기 전에 새 프로세스 안에 존재하며 osx에서 python-multiprocessing을 사용합니다. 윈도우/리눅스에
다중 프로세서 가져 오기 모듈

 

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 가져 오기 전에로드되지 않습니다

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

그러나 OSX에, 스크립트가 한 번만 가져옵니다, UUID는 가져 오기 전에로드 및 uuid.some_variable이 존재 새로운 프로세스에 :

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

어떻게 든, 주요 공정의 UUID 모듈을 가져 오지 않고, 하위 프로세스로 가져옵니다.
뭔가가 누락 되었습니까? 버그입니까, 아니면 Mac이 이럴만한 이유가 있습니까?
모듈은 어떻게 서브 프로세스에 들어갔습니까?

+0

아치 리눅스에서 파이썬 2.7로 정확한 코드를 실행하면 ("2to3' 사용 후 파이썬 3.2) 정확한 코드를 실행할 때"uuid 모듈이로드되었습니다 : True "와"var on mac True "가 나타납니다. Linux와 MacOS에서 사용하고있는 파이썬 버전을 알려주시겠습니까? – Schnouki

+0

@Schnouki : 모두 파이썬 2.6입니다. Windows 7, Fedora 11, OSX 10.6.6. 결과는 내가 원하지 않는 결과입니다. 모듈을 가져 오기 위해 각 프로세스가 필요합니다. –

답변

1

문제는 다중 처리가 유닉스에서 os.fork를 사용한다는 것입니다. 따라서 하위 프로세스는 주 프로세스의 복사본이됩니다. Fedora에서 어떤 일이 벌어지는 지 알지 못하지만 Linux에서도 작동하지 않아야합니다.
주위를 둘러 보려는 쉬운 방법이없는 것처럼 보입니다.

0

mac 구현이 가져 오기를 다르게 처리하는 것 같습니다. 그럼에도 불구하고, 당신은 사용하여 모듈의 자신의 저장소를 구현하여 해킹 할 수

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

context이 프로세스의 각 하나입니다. 왜 당신이 이것을하고 싶어하는지 모르지만, 이것이 효과가 있습니다.

관련 문제