하위 프로세스 표준 출력에 대한 비차단 읽기
하위 프로세스 모듈을 활용하여 하위 프로세스를 시작하고 해당 표준 출력 스트림에 연결하는 경우는 다음과 같습니다. 프로그램 응답성을 유지하기 위해 비차단 읽기를 수행하는 데 필수적입니다. 이 문서에서는 하위 프로세스 표준 출력에서 비차단 읽기를 달성하거나 .readline을 호출하기 전에 데이터 가용성을 평가하는 기술에 대해 자세히 설명합니다.
전통적인 차단 접근 방식
일반적으로 다음 내용을 읽어보세요. 표준 출력이 차단됩니다. 즉, 데이터를 사용할 수 있을 때까지 실행이 중단됩니다. 아래에 설명되어 있습니다.
import subprocess p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE) output_str = p.stdout.readline()
그러나 이 접근 방식에서는 스트림에 데이터가 즉시 존재하지 않으면 실행이 중단됩니다.
Queue.get_nowait로 읽기 차단 극복 ()
읽기 차단을 방지하기 위한 안정적인 크로스 플랫폼 접근 방식은 대기열을 사용하는 것입니다. 모듈과 해당 get_nowait() 메서드. 이 방법은 스트림의 데이터 부재를 적절하게 처리하여 비차단 읽기를 허용합니다.
import sys from subprocess import PIPE, Popen from threading import Thread from queue import Queue, Empty ON_POSIX = 'posix' in sys.builtin_module_names def enqueue_output(out, queue): for line in iter(out.readline, b''): queue.put(line) out.close() p = Popen(['myprogram.exe'], stdout=PIPE, bufsize=1, close_fds=ON_POSIX) q = Queue() t = Thread(target=enqueue_output, args=(p.stdout, q)) t.daemon = True # thread dies with the program t.start() try: line = q.get_nowait() except Empty: print('no output yet') else: # got line # ... do something with line
이 접근 방식에서는 별도의 스레드가 생성되어 하위 프로세스의 표준 출력 출력을 대기열에 지속적으로 추가합니다. 그러면 메인 스레드는 get_nowait()를 호출하여 비차단 읽기를 수행할 수 있습니다. 대기열이 비어 있으면 호출이 차단되지 않고 반환되어 기본 스레드가 진행될 수 있습니다.
위 내용은 하위 프로세스의 표준 출력에서 비차단 읽기를 어떻게 달성할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!