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

Python의 하위 프로세스 파이프에서 비차단 읽기를 어떻게 달성할 수 있습니까?

DDD
DDD원래의
2024-12-19 13:55:11752검색

How Can I Achieve Non-Blocking Reads from Subprocess Pipes in Python?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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