> 백엔드 개발 > 파이썬 튜토리얼 > 연속 프로세스 출력을 캡처할 때 Python 프로그램이 중단되는 것을 어떻게 방지할 수 있습니까?

연속 프로세스 출력을 캡처할 때 Python 프로그램이 중단되는 것을 어떻게 방지할 수 있습니까?

Susan Sarandon
풀어 주다: 2024-10-29 18:19:09
원래의
903명이 탐색했습니다.

How Can I Prevent Python Programs from Hanging When Capturing Continuous Process Output?

Python에서 중단 없이 프로세스 출력 읽기 중지

os.popen()을 사용하여 프로세스 출력을 캡처할 때 다음과 같은 경우 프로그램이 중단될 수 있습니다. 프로세스는 지속적으로 데이터를 출력합니다. 이 문제를 해결하려면 다음과 같은 대체 방법을 사용하는 것이 좋습니다.

하위 프로세스 및 스레드 사용

subprocess.Popen으로 프로세스를 시작하고, 출력을 읽는 스레드를 생성하고, 그리고 이를 큐에 저장합니다. 특정 시간 초과 후 프로세스를 종료합니다.

<code class="python">import subprocess
import threading
import time

def read_output(process, append):
    for line in iter(process.stdout.readline, ""):
        append(line)

def main():
    process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True)
    try:
        q = collections.deque(maxlen=200)
        t = threading.Thread(target=read_output, args=(process, q.append))
        t.daemon = True
        t.start()
        time.sleep(2)
    finally:
        process.terminate()
    print(''.join(q))</code>
로그인 후 복사

신호 처리기 사용

지정된 시간 초과 후 예외를 발생시키려면 signal.alarm()을 사용하세요. 이렇게 하면 프로세스가 강제 종료되어 출력이 캡처될 수 있습니다.

<code class="python">import signal
import subprocess
import time

def alarm_handler(signum, frame):
    raise Alarm

def main():
    process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True)
    signal.signal(signal.SIGALRM, alarm_handler)
    signal.alarm(2)
    q = collections.deque(maxlen=200)
    try:
        for line in iter(process.stdout.readline, ""):
            q.append(line)
        signal.alarm(0)
    except Alarm:
        process.terminate()
    finally:
        print(''.join(q))</code>
로그인 후 복사

타이머 사용

threading.Timer를 사용하여 시간 초과 후 프로세스를 종료합니다.

<code class="python">import threading
import subprocess

def main():
    process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True)
    timer = threading.Timer(2, process.terminate)
    timer.start()
    q = collections.deque(process.stdout, maxlen=200)
    timer.cancel()
    print(''.join(q))</code>
로그인 후 복사

대체 접근법

  • 임시 파일: 프로세스 출력을 임시로 파일에 저장한 후 프로세스가 끝난 후 읽습니다. 죽었습니다.
  • 정기 폴링: 프로세스가 종료될 때까지 루프에서 주기적으로 출력을 읽습니다.
  • 비차단 출력 스트림: 중단을 방지하기 위해 비차단 출력 스트림을 지원하는 라이브러리입니다.

이러한 솔루션은 추가적인 복잡성이나 호환성 문제를 초래할 수 있습니다. 특정 요구 사항과 플랫폼에 가장 적합한 접근 방식을 선택하세요.

위 내용은 연속 프로세스 출력을 캡처할 때 Python 프로그램이 중단되는 것을 어떻게 방지할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿