Python에서 다중 처리 또는 스레딩을 사용하지 않고 여러 하위 프로세스를 병렬로 실행하고 해당 출력을 수집하려면 어떻게 해야 합니까?

Susan Sarandon
풀어 주다: 2024-10-26 21:51:03
원래의
983명이 탐색했습니다.

How can I run multiple subprocesses in parallel and collect their output without using multiprocessing or threading in Python?

출력 컬렉션과 병렬로 하위 프로세스 실행

주어진 시나리오에서 여러 cat | zgrep 명령은 원격 서버에서 순차적으로 실행됩니다. 개별 출력을 수집하는 동안 이러한 명령을 동시에 실행하려면 멀티프로세싱이나 스레딩을 사용하지 않아야 합니다.

간단한 해결책은 subprocess 모듈에서 Popen 기능을 사용하는 것입니다. 각 명령에 대해 개별 Popen 개체를 만들고 여기에 셸 인수를 전달하면 병렬로 실행할 수 있습니다. 명령이 완료되면 wait 메소드를 사용하여 종료 코드를 수집할 수 있습니다. 예는 다음과 같습니다.

<code class="python">from subprocess import Popen

# Create a list of commands
commands = ['echo {i:d}; sleep 2; echo {i:d}' for i in range(5)]

# Run commands in parallel
processes = [Popen(command, shell=True) for command in commands]

# Collect statuses
exitcodes = [p.wait() for p in processes]</code>
로그인 후 복사

이 코드는 5개의 명령을 동시에 실행하고 명령이 완료되면 해당 종료 코드를 수집합니다.

명령의 출력을 수집하려면 스레드 또는 별도의 프로세스에서 통신 방법을 수행합니다. 예를 들어 스레드 풀 사용:

<code class="python">from multiprocessing.dummy import Pool # thread pool
from subprocess import Popen

# Run commands in parallel
processes = [Popen(command, shell=True, close_fds=True) for command in commands]

# Collect output in parallel
def get_output(process):
    return process.communicate()[0]

outputs = Pool(len(processes)).map(get_output, processes)</code>
로그인 후 복사

이 코드는 스레드 풀에서 모든 명령을 동시에 실행하고 해당 출력을 목록으로 수집합니다. 여기서 각 요소는 개별 명령의 출력에 해당합니다.

또 다른 대안은 동일한 스레드(Python 3.8 이상)에서 출력 수집을 위해 asyncio 모듈을 사용하는 것입니다.

<code class="python">import asyncio
from subprocess import PIPE

async def get_output(command):
    process = await asyncio.create_subprocess_shell(command, stdout=PIPE)
    return (await process.communicate()[0]).decode()

# Get commands output in parallel
coros = [get_output(command) for command in commands]
outputs = await asyncio.gather(*coros)</code>
로그인 후 복사

이 코드는 명령을 동시에 실행하고 출력을 목록으로 반환하는 코루틴을 생성합니다.

위 내용은 Python에서 다중 처리 또는 스레딩을 사용하지 않고 여러 하위 프로세스를 병렬로 실행하고 해당 출력을 수집하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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