>백엔드 개발 >파이썬 튜토리얼 >하위 프로세스의 표준 출력에서 ​​비차단 읽기를 어떻게 달성할 수 있습니까?

하위 프로세스의 표준 출력에서 ​​비차단 읽기를 어떻게 달성할 수 있습니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-25 15:07:14268검색

How Can I Achieve Non-Blocking Reads from a Subprocess's Standard Output?

하위 프로세스 표준 출력에 대한 비차단 읽기

하위 프로세스 모듈을 활용하여 하위 프로세스를 시작하고 해당 표준 출력 스트림에 연결하는 경우는 다음과 같습니다. 프로그램 응답성을 유지하기 위해 비차단 읽기를 수행하는 데 필수적입니다. 이 문서에서는 하위 프로세스 표준 출력에서 ​​비차단 읽기를 달성하거나 .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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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