2010-12-04 2 views
5

파이썬 다중 처리 모듈을 탐색 중이며 다음 코드가 아무 것도 인쇄하지 않는 이유를 이해하지 못합니다. while 루프가 없으면 프로그램은 Worker_1을 예상대로 인쇄합니다. 예상대로 내 시스템 (파이썬 리눅스 2.6 & 2.7)에파이썬 다중 처리 : 작업자 함수에서 while 루프로 출력되지 않습니다.

import multiprocessing, time 

def worker1(): 
    print 'Worker_1' 
    while 1: 
     print 'Worker_1' 
     time.sleep(3) 
    return 

if __name__ == '__main__': 
    jobs = [] 
    p = multiprocessing.Process(target=worker1) 
    jobs.append(p) 
    p.start() 
+0

멀티 프로세싱 모듈에서 마스터가 아니므로 지금 테스트 할 수는 없지만'p.join()'을'p.start()'뒤에 추가해보십시오. 하위 프로세스가 시작된 후 주 프로그램이 종료되면 하위 프로세스가 계속 진행됩니까? 나는 그렇게 생각하지 않지만, 나는 모른다. 이것은 당신이 원할 때 작업자를 멈추게하기위한 몇 가지 헛소리를해야한다는 것을 의미합니다. 또는 포크 모듈을 살펴보십시오. –

답변

2

이 작동합니다. 어떤 플랫폼을 사용하고 있습니까? 일부 플랫폼 (Windows)에서는 완전히 새로운 프로세스를 생성하고 설정하여 에뮬레이트 될 fork입니다. 일부 stdout 자식 프로세스로 전송되지 않습니다 용의자. 시도 :

  • threading 모듈. 스레드의 이벤트를 기다리고 싶다면 충분합니다.
  • 파일
+0

현재 저는 Eclipse와 PyDev를 Windows에서 사용하고 있습니다. 파일로 출력해도 작동하지 않습니다. 방금 빈 파일을 가져옵니다. 내가 이해하지 못하는 것은 while 루프의 중요성이다. 루프가없는 출력이 있지만 출력은 없습니다. – chessweb

+0

sys.stdout.flush()를 추가해보십시오. 아마도? –

+0

'print ("something")'이 Windows의 하위 프로세스에서 작동하지 않는다고 생각합니다. '포크'는 그 이유가 아닙니다. 나는이 질문에서 파이썬 3.4 코드로 포팅을 시도했지만 ['multiprocessing.set_start_method ('spawn')'] (http://docs.python.org/3.4/library/multiprocessing.html)을 사용하여 예상되는 결과를 얻는다. # contexts-and-start-methods) ('fork'는 자연스럽게 작동합니다). – jfs

0

당신이 IDLE을 사용하고로 출력 같은 BSD, 리눅스, 솔라리스

  • 등의 POSIX 호환 플랫폼에서 프로그램을 실행? 나는 이것이 문제라고 생각한다. 명령 행에서 호출 할 때 Linux에서 나를 위해 작동하는 코드 (3 초마다 'Worker_1'이 인쇄 됨). 유휴 상태에서 시도하면 즉시 멈 춥니 다. 이는 바로 p.join()이 없기 때문에 주 프로세스가 즉시 중지되어 작업자 프로세스가 중지되기 때문입니다. 분명히, p.join()은 Linux의 명령 줄에서 필요하지는 않지만 어쨌든 권장합니다.

    그러나 IDLE을 사용하여 p.join() 일지라도 스크립트가 거기에 위치하므로 텍스트가 표시되지 않습니다. Idle이 idlelib.rpc.RPCProxy로 stdout을 재 라우팅하는 이상한 방법 때문에 이것은 생각합니다. 즉, IDLE을 사용한다면 문제가됩니다.

  • +0

    Windows에서 PyDev와 함께 Ecplise를 사용하고 있습니다. – chessweb

    관련 문제