복붙노트

[PYTHON] Spyder의 간단한 Python 다중 처리 기능이 결과를 출력하지 않습니다.

PYTHON

Spyder의 간단한 Python 다중 처리 기능이 결과를 출력하지 않습니다.

여기에 내가 실행하고 테스트하려고하는이 아주 간단한 함수가 있습니다. 그러나 아무 것도 출력하지 않으며 오류도 없습니다. 코드를 여러 번 확인했지만 오류가 없습니다.

나는 일자리를 인쇄했고 여기에 내가 가진 것이있다.

[<Process(Process-12, stopped[1])>, 
<Process(Process-13, stopped[1])>,
<Process(Process-14, stopped[1])>, 
<Process(Process-15, stopped[1])>,
<Process(Process-16, stopped[1])>]

코드는 다음과 같습니다.

import multiprocessing

def worker(num):
    print "worker ", num
    return

jobs = []
for i in range(5):
    p = multiprocessing.Process(target = worker, args = (i,))
    jobs.append(p)
    p.start()

여기 내가 기대하는 결과가 있지만 아무 것도 출력하지 않습니다.

Worker: 0
Worker: 1
Worker: 2
Worker: 3
Worker: 4

해결법

  1. ==============================

    1.OP는 Windows뿐만 아니라 Spyder도 사용한다는 의견이 나왔습니다. Spyder가 stdout을 리디렉션하고 Windows에서 분기를 지원하지 않으므로 새 하위 프로세스가 Spyder 콘솔에 인쇄되지 않습니다. 이는 단순히 새로운 자식 프로세스의 표준 출력이 Python의 바닐라 stdout이며 sys .__ stdout__에서도 찾을 수 있기 때문입니다.

    OP는 Windows뿐만 아니라 Spyder도 사용한다는 의견이 나왔습니다. Spyder가 stdout을 리디렉션하고 Windows에서 분기를 지원하지 않으므로 새 하위 프로세스가 Spyder 콘솔에 인쇄되지 않습니다. 이는 단순히 새로운 자식 프로세스의 표준 출력이 Python의 바닐라 stdout이며 sys .__ stdout__에서도 찾을 수 있기 때문입니다.

    두 가지 대안이 있습니다.

    풀을 사용한 다중 처리 예제 :

    import multiprocessing
    
    def worker(num):
        """Returns the string of interest"""
        return "worker %d" % num
    
    def main():
        pool = multiprocessing.Pool(4)
        results = pool.map(worker, range(10))
    
        pool.close()
        pool.join()
    
        for result in results:
            # prints the result string in the main process
            print(result)
    
    if __name__ == '__main__':
        # Better protect your main function when you use multiprocessing
        main()
    

    어떤 인쇄 (메인 프로세스에서)

    worker 0
    worker 1
    worker 2
    worker 3
    worker 4
    worker 5
    worker 6
    worker 7
    worker 8
    worker 9
    

    편집 :지도 함수가 끝날 때까지 기다리지 않으려면 imap_unordered를 사용하고 명령 순서를 약간 변경하여 즉시 결과를 인쇄 할 수 있습니다.

    def main():
        pool = multiprocessing.Pool(4)
        results = pool.imap_unordered(worker, range(10))
    
        for result in results:
            # prints the result string in the main process as soon as say are ready
            # but results are now no longer in order!
            print(result)
    
        # The pool should join after printing all results
        pool.close()
        pool.join()
    
  2. from https://stackoverflow.com/questions/29629103/simple-python-multiprocessing-function-in-spyder-doesnt-output-results by cc-by-sa and MIT license