>  기사  >  백엔드 개발  >  Python에서 Subprocess.call의 비차단 실행을 달성하는 방법은 무엇입니까?

Python에서 Subprocess.call의 비차단 실행을 달성하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-19 13:53:02781검색

How to Achieve Non-Blocking Execution of Subprocess.call in Python?

비 차단 subprocess.call: 병렬 스크립트 실행 달성

Python 프로그램에서 asubprocess.call()을 실행할 때 일반적으로 호출자는 계속 진행하기 전에 하위 프로세스가 완료될 때까지 기다립니다. 그러나 특정 애플리케이션의 경우 하위 프로세스가 동시에 실행되는 동안 호출자가 계속 실행할 수 있도록 하위 프로세스를 비차단으로 만드는 것이 바람직할 수 있습니다.

문제 시나리오

다음 시나리오를 고려하십시오. "main.py" 프로그램에서 non-blockingsubprocess.call()로 "slave.py" 스크립트를 시작하려고 합니다. "main.py"에서 "slave.py"가 처음 시작될 때 인수를 한 번 전달해야 하지만 그 이후에는 스크립트 간에 추가 통신이 필요하지 않습니다.

해결책: subprocess.Popen

"slave.py"의 비차단 실행을 달성하려면 "main.py"에서 "subprocess.call()"을 "subprocess.Popen()으로 바꾸세요. 하위 프로세스를 기다리는 대신 완료하려면 "subprocess.Popen()"이 즉시 반환되어 "main.py"가 작업을 계속할 수 있습니다.

코드 예

<code class="python">import subprocess
import sys

subprocess.Popen(["python", "slave.py"] + sys.argv[1:])</code>

대안: asyncio

최신 버전의 Python(3.5 이상)에서는 "asyncio" 모듈을 활용하여 비차단 하위 프로세스 호출을 구현할 수 있습니다. 이 접근 방식은 코루틴과의 동시성을 활용하여 여러 작업을 실행할 수 있습니다. 동시에.

코드 예제(asyncio)

<code class="python">import asyncio

async def do_subprocess():
    proc = await asyncio.create_subprocess_exec('sleep', '5')
    returncode = await proc.wait()
    print(f'Subprocess done sleeping. Return code = {returncode}')

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(do_subprocess()))
loop.close()</code>

추가 참고사항

  • "shell= 사용 시 사실입니다." 인수를 전달하기 위해 목록을 사용하지 않는 것을 기억하십시오. 이는 보안 취약점으로 이어질 수 있습니다.
  • 제공된 MCVE(최소 완료 검증 가능 예제)는 "subprocess.Popen( )'과 'asyncio'를 통해 실용적인 환경에서 컨셉을 선보였습니다.

위 내용은 Python에서 Subprocess.call의 비차단 실행을 달성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.