programing

파이썬 멀티프로세싱 모듈의 .join() 메서드는 정확히 무엇을 하고 있습니까?

powerit 2023. 7. 17. 21:28
반응형

파이썬 멀티프로세싱 모듈의 .join() 메서드는 정확히 무엇을 하고 있습니까?

(PMOTW 기사에서) Python Multiprocessing에 대해 배우고 정확히 무엇인지 설명하고 싶습니다.join()방법은 하고 있습니다.

2008년의 오래된 튜토리얼에서 그것은 다음과 같이 말합니다.p.join()아래 코드를 호출합니다. "하위 프로세스는 유휴 상태로 종료되지 않고 수동으로 죽여야 하는 좀비가 됩니다."

from multiprocessing import Process

def say_hello(name='world'):
    print "Hello, %s" % name

p = Process(target=say_hello)
p.start()
p.join()

저는 의 프린트 아웃을 추가했습니다.PID뿐만 아니라time.sleep테스트를 위해, 그리고 제가 아는 한, 프로세스는 스스로 종료됩니다.

from multiprocessing import Process
import sys
import time

def say_hello(name='world'):
    print "Hello, %s" % name
    print 'Starting:', p.name, p.pid
    sys.stdout.flush()
    print 'Exiting :', p.name, p.pid
    sys.stdout.flush()
    time.sleep(20)

p = Process(target=say_hello)
p.start()
# no p.join()

20초 이내:

936 ttys000    0:00.05 /Library/Frameworks/Python.framework/Versions/2.7/Reso
938 ttys000    0:00.00 /Library/Frameworks/Python.framework/Versions/2.7/Reso
947 ttys001    0:00.13 -bash

20초 후:

947 ttys001    0:00.13 -bash

와 같습니다.p.join()파일 끝에 다시 추가되었습니다.Python Module of the Week는 "프로세스가 작업을 완료하고 종료될 때까지 기다리려면 join() 방법을 사용하십시오."라는 모듈에 대한 매우 읽기 쉬운 설명을 제공하지만, 적어도 OS X는 어쨌든 그렇게 하고 있었던 것 같습니다.

그 방법의 이름도 궁금합니다.은 ▁이▁is?.join()여기서 연결하는 방법은 무엇입니까?프로세스와 프로세스의 끝을 연결하는 것입니까?파이썬의 요?.join()방법?

join() 메서드, 경함사와 함께 threading또는multiprocessing과 .str.join()실제로 어떤 것을 연결하는 것이 아닙니다.오히려 "이 [스레드/프로세스]가 완료될 때까지 기다립니다"라는 의미입니다. 이름은 은이름입니다.join 때문에 됩니다.multiprocessing모듈의 API는 다음과 유사하게 보입니다.threading모의 API 및threading은 듈모사를 사용합니다.join그것 때문에Thread물건. 하는 것.join"스레드가 완료될 때까지 기다린다"는 의미는 많은 프로그래밍 언어에서 일반적이기 때문에 Python도 이를 채택했습니다.

자,이 20초의 이 제이, 초가, 되는에 것으로 보이는 , 입우통입니다.join() 기적으주프스종준료되비가호때암다문출니입기하를 호출하기 때문입니다.join() 방면에서.multiprocessing.Process예를 들면이것은 다음과 같이 명확하게 명시되어 있지 않습니다.multiprocessing문서가 있어야 하지만 프로그래밍 가이드라인 섹션에 언급되어 있습니다.

또한 비대모닉 프로세스는 자동으로 결합됩니다.

은 다을설이재수있할습다니정의를 설정하여 할 수 .daemon의깃발의 ProcessTrue프로세스를 시작하기 전에:

p = Process(target=say_hello)
p.daemon = True
p.start()
# Both parent and child will exit here, since the main process has completed.

이렇게 하면 기본 프로세스가 완료되는 즉시 하위 프로세스가 종료됩니다.

데몬

프로세스의 데몬 플래그, 부울 값입니다.start()를 호출하기 전에 이 값을 설정해야 합니다.

초기 값은 생성 프로세스에서 상속됩니다.

프로세스가 종료되면 모든 대몬 자식 프로세스를 종료하려고 시도합니다.

다음을 제외하고는join()기본 프로세스는 하위 프로세스보다 먼저 완료될 수 있습니다.어떤 상황에서 그것이 좀비주의로 이어지는지 잘 모르겠습니다.

의주목은의 주된 join()기본 프로세스가 하위 프로세스의 작업에 따라 달라지는 모든 작업을 수행하기 전에 하위 프로세스가 완료되었는지 확인하는 것입니다.

join()그것은 그것과 반대라는 것입니다.fork이는 유닉스 계열 운영 체제에서 하위 프로세스를 만드는 일반적인 용어입니다.단일 프로세스가 여러 개로 "포크"된 다음 다시 하나로 "결합"됩니다.

구체적으로 설명하지 않겠습니다.join그렇습니다, 하지만 여기에 그 뒤에 있는 어원과 직관이 있습니다, 그것은 당신이 그것의 의미를 더 쉽게 기억하는 데 도움이 될 것입니다.

이 개념은 실행이 /기본 프로세스인 여러 프로세스와 나머지 작업자(또는 부/보조 프로세스)로 "포크"된다는 것입니다.작업이 완료되면, 작업자들은 직렬 실행이 재개될 수 있도록 프로세스에 "합류"합니다.

join()기본 프로세스가 작업자가 참여할 때까지 대기하도록 합니다.이 메서드는 마스터에서 발생하는 실제 동작이기 때문에 "wait"라고 부르는 것이 더 나을 수 있습니다(POSIX 스레드에서도 "join"이라고 부르지만 POSIX에서는 그렇게 부릅니다).결합은 스레드가 올바르게 작동하는 결과로만 발생하며, 주요 프로세스가 수행하는 작업이 아닙니다.

"fork"와 "join"이라는 이름은 1963년부터 멀티프로세싱에서 이러한 의미로 사용되어 왔습니다.

join() 합니다.call 은모 다든 처중프완가료되전기에후합코니다행않록도이지호출되속의드스세로리▁call▁are합다니call▁ensures▁code▁of은록도▁that않▁linesent▁subsequ▁all▁not지▁before▁your▁arero▁called되출호이행▁the▁processes.

예를 들어, 다음을 제외하고는join()다음 코드가 호출할 것입니다.restart_program()프로세스가 완료되기도 전에 비동기식과 유사하며 우리가 원하는 것이 아닙니다(시도할 수 있습니다).

num_processes = 5

for i in range(num_processes):
    p = multiprocessing.Process(target=calculate_stuff, args=(i,))
    p.start()
    processes.append(p)
for p in processes:
    p.join() # call to ensure subsequent line (e.g. restart_program) 
             # is not called until all processes finish

restart_program()

join()작업자 프로세스가 종료될 때까지 대기하는 데 사용됩니다.꼭 전화해야 합니다close()또는terminate()사하기전에를 사용하기 join().

@Russell이 언급한 것처럼 join은 포크의 반대와 같습니다(Snes 하위 프로세스).

는 실려실합니다야해행면을 실행해야 .close()이렇게 하면 모든 작업이 완료되면 더 이상 작업이 풀에 제출되지 않고 종료됩니다.를 합니다.terminate()모든 작업자 프로세스를 즉시 중지하여 종료합니다.

"the child process will sit idle and not terminate, becoming a zombie you must manually kill"기본(부모) 프로세스가 종료되지만 하위 프로세스가 여전히 실행 중이고 완료되면 종료 상태를 되돌릴 상위 프로세스가 없는 경우에 가능합니다.

프로세스가 작업을 완료하고 종료될 때까지 기다리려면 join() 방법을 사용합니다.

그리고.

참고 프로세스를 종료한 후 프로세스에 참여하는 것이 중요합니다. 프로세스를 종료한 후에는 백그라운드 시스템이 종료를 반영하도록 개체의 상태를 업데이트할 시간을 줍니다.

이것은 제가 그것을 이해하는 데 도움이 된 좋은 예입니다: 여기.

한 한 입니다. join() 은 제 시켰습니다.multiprocessing.Process()애당초

언급URL : https://stackoverflow.com/questions/25391025/what-exactly-is-python-multiprocessing-modules-join-method-doing

반응형