복붙노트

[PYTHON] 블로킹 및 비 블로킹 서브 프로세스 호출

PYTHON

블로킹 및 비 블로킹 서브 프로세스 호출

나는 subprocess.call (), subprocess.Popen (), subprocess.check_call () 사이에 완전히 혼란 스럽다.

차단하고있는 것은 무엇입니까?

내가 말하고자하는 것은 부모 프로세스가 실행을 계속하기 전에 자식 프로세스가 리턴 / 종료 할 때까지 대기하는지 여부를 subprocess.Popen ()을 사용하면됩니다.

shell = True가이 호출에 어떻게 영향을 줍니까?

해결법

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

    1.Popen은 비 차단입니다. call 및 check_call이 차단 중입니다. wait 또는 communicate 메소드를 호출하여 Popen 인스턴스를 차단할 수 있습니다.

    Popen은 비 차단입니다. call 및 check_call이 차단 중입니다. wait 또는 communicate 메소드를 호출하여 Popen 인스턴스를 차단할 수 있습니다.

    소스 코드를 살펴보면 Popen (...). wait ()라는 호출이 표시되어 차단되고있는 것입니다. check_call은 호출을 호출하기 때문에 호출도 차단됩니다.

    엄밀히 말하면 shell = True는 블로킹 문제와 직각을 이룹니다. 그러나 shell = True로 설정하면 파이썬이 쉘을 실행 한 다음 쉘에서 명령을 실행합니다. 블로킹 호출을 사용하면 쉘이 완료 될 때 호출이 리턴됩니다. 쉘은 명령을 실행하기 위해 서브 프로세스를 생성 할 수 있기 때문에 쉘은 생성 된 서브 프로세스보다 먼저 완료 될 수 있습니다. 예를 들어,

    import subprocess
    import time
    
    proc = subprocess.Popen('ls -lRa /', shell=True)
    time.sleep(3)
    proc.terminate()
    proc.wait()
    

    여기에는 두 개의 프로세스가 생성됩니다. Popen은 셸을 실행하는 하나의 하위 프로세스를 생성합니다. 쉘은 차례대로 ls를 실행하는 서브 프로세스를 생성합니다. proc.terminate ()는 쉘을 종료하지만 ls를 실행하는 하위 프로세스는 남아 있습니다. (이것은 파이썬 스크립트가 끝난 후에도 상당한 출력으로 나타납니다 .Psill로 ls를 죽일 준비를하십시오.)

  2. from https://stackoverflow.com/questions/21936597/blocking-and-non-blocking-subprocess-calls by cc-by-sa and MIT license