Python의 하위 프로세스 파이프에 대한 비차단 읽기
하위 프로세스 파이프는 Python 내에서 외부 프로그램과 통신하는 방법을 제공합니다. 그러나 기본적으로 표준 출력에서 읽으면 데이터를 사용할 수 있을 때까지 프로세스가 차단됩니다. 비차단 읽기가 필요한 애플리케이션의 경우 고려해야 할 몇 가지 접근 방식이 있습니다.
fcntl, select 및 asyncproc를 피하세요
일반적으로 권장되는 반면 fcntl, select 및 asyncproc는 권장됩니다. 이 시나리오에는 적합하지 않을 수 있습니다. fcntl 및 select에는 플랫폼별 코드가 필요한 반면 asyncproc은 다중 처리에 의존하므로 추가 오버헤드가 발생하고 파이프와 제대로 상호 작용할 수 없습니다.
큐 기반 솔루션
신뢰할 수 있는 솔루션 이식 가능한 솔루션은 Queue.get_nowait() 호출을 사용하는 것입니다. 작동 방식은 다음과 같습니다.
from queue import Queue, Empty from subprocess import PIPE, Popen from threading import Thread # Initialize a subprocess and a queue for output p = Popen(['myprogram.exe'], stdout=PIPE, bufsize=1) q = Queue() # Create a thread to enqueue output from the subprocess t = Thread(target=enqueue_output, args=(p.stdout, q)) t.daemon = True t.start() # Read the queue in a non-blocking manner try: line = q.get_nowait() except Empty: print('No output yet') else: # ... process the output line
이 접근 방식에서는 별도의 스레드를 사용하여 하위 프로세스의 출력을 대기열에 넣습니다. 그러면 기본 프로세스는 차단하지 않고 대기열에서 데이터를 가져오려고 시도할 수 있습니다. 대기열이 비어 있으면 빈 예외를 반환합니다.
이 솔루션은 이식성이 뛰어나고 효율적이며 플랫폼별 코드나 추가 종속성이 필요하지 않고 하위 프로세스 파이프에서 비차단 읽기를 허용합니다.
위 내용은 Python의 하위 프로세스 파이프에서 비차단 읽기를 어떻게 달성할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!