출력 컬렉션과 병렬로 하위 프로세스 실행
주어진 시나리오에서 여러 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!