subprocess.call을 사용하여 외부 스크립트를 실행할 때 기본 프로그램이 중단되는 것을 방지하려면 비차단 작업 흐름을 유지하는 것이 필수적입니다. 이 문서에서는 이 목표를 달성하기 위한 포괄적인 솔루션을 제시합니다.
비차단 하위 프로세스를 실행하는 기본 방법은 subprocess.call 대신 subprocess.Popen을 사용하는 것입니다. 이 대안은 기본 프로그램을 차단하지 않으므로 하위 프로세스가 독립적으로 실행되는 동안 작업을 계속할 수 있습니다. 예는 다음과 같습니다.
subprocess.Popen(["python", "slave.py"] sys.argv[1:])
비차단 하위 프로세스 호출에 대한 전체 데모를 보려면 다음 코드를 고려하세요.
import subprocess
import time
p = subprocess.Popen(['sleep', '5'])
while p.poll() is None:
print('Still sleeping')
time.sleep(1)
print('Not sleeping any longer. Exited with returncode %d' % p.returncode)
이 코드는 'sleep' 명령을 비동기식으로 실행하여 완료될 때까지 주기적으로 상태를 확인합니다.
Python 버전 3.5 이상의 경우 보다 현대적이고 효율적인 접근 방식은 asyncio를 사용하는 것입니다. 진정한 동시성을 허용하여 여러 작업을 동시에 실행할 수 있습니다. 예는 다음과 같습니다.
import asyncio
async def do_subprocess():
print('Subprocess sleeping')
proc = await asyncio.create_subprocess_exec('sleep', '5')
returncode = await proc.wait()
print('Subprocess done sleeping. Return code = %d' % returncode)
async def sleep_report(number):
for i in range(number 1):
print('Slept for %d seconds' % i)
await asyncio.sleep(1)
loop = asyncio.get_event_loop()
tasks = [
asyncio.ensure_future(do_subprocess()),
asyncio.ensure_future(sleep_report(5)),
]
loop.run_until_complete(asyncio.gather(*tasks))
loop.close()
이 접근 방식을 사용하면 하위 프로세스와 기본 프로그램이 동시에 실행되어 성능과 응답성이 최대화됩니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3