>  기사  >  백엔드 개발  >  여러 개의 \'cat를 실행하는 방법 | zgrep\' 명령이 Python에서 동시에 실행됩니까?

여러 개의 \'cat를 실행하는 방법 | zgrep\' 명령이 Python에서 동시에 실행됩니까?

DDD
DDD원래의
2024-10-27 07:09:29298검색

How to Execute Multiple 'cat | zgrep' Commands Concurrently in Python?

'cat | zgrep' 명령을 동시에 실행

이 Python 스크립트에서는 여러 개의 'cat | zgrep' 명령은 원격 서버에서 순차적으로 실행되며 해당 출력은 처리를 위해 개별적으로 수집됩니다. 그러나 효율성을 높이기 위해 이러한 명령을 병렬로 실행하는 것을 목표로 합니다.

스레딩 없이 하위 프로세스 사용

멀티 프로세싱이나 스레딩을 사용하는 것과 달리 다음 접근 방식을 사용하여 하위 프로세스를 병렬로 실행할 수 있습니다.

<code class="python">#!/usr/bin/env python
from subprocess import Popen

# create a list of subprocesses
processes = [Popen("echo {i:d}; sleep 2; echo {i:d}".format(i=i), shell=True) for i in range(5)]

# collect statuses of subprocesses
exitcodes = [p.wait() for p in processes]</code>

이 코드는 5개의 셸 명령을 동시에 실행하고 종료 코드를 수집합니다. Popen은 기본적으로 명령이 완료될 때까지 기다리지 않으므로 이 컨텍스트에서는 & 문자가 필요하지 않습니다. 상태를 검색하려면 .wait()를 명시적으로 호출해야 합니다.

출력 수집이 있는 하위 프로세스

하위 프로세스의 출력을 순차적으로 수집하는 것이 편리하지만 원하는 경우 병렬 수집을 위해 스레드를 사용할 수도 있습니다. . 다음 예를 고려하십시오.

<code class="python">#!/usr/bin/env python
from multiprocessing.dummy import Pool # thread pool
from subprocess import Popen, PIPE, STDOUT

# create a list of subprocesses with output handling
processes = [Popen("echo {i:d}; sleep 2; echo {i:d}".format(i=i), shell=True,
                   stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
             for i in range(5)]

# collect outputs in parallel
def get_lines(process):
    return process.communicate()[0].splitlines()

outputs = Pool(len(processes)).map(get_lines, processes)</code>

이 코드는 하위 프로세스를 병렬로 실행하고 스레드를 사용하여 동시에 해당 출력을 수집합니다.

Asyncio 기반 병렬 실행

Python 버전 3.8 및 위에서 asyncio는 하위 프로세스를 동시에 실행하는 우아한 방법을 제공합니다. 예는 다음과 같습니다.

<code class="python">#!/usr/bin/env python3
import asyncio
import sys
from subprocess import PIPE, STDOUT

async def get_lines(shell_command):
    p = await asyncio.create_subprocess_shell(
        shell_command, stdin=PIPE, stdout=PIPE, stderr=STDOUT
    )
    return (await p.communicate())[0].splitlines()


async def main():
    # create a list of coroutines for subprocess execution
    coros = [get_lines(f'"{sys.executable}" -c "print({i:d}); import time; time.sleep({i:d})"') for i in range(5)]

    # get subprocess outputs in parallel
    print(await asyncio.gather(*coros))

if __name__ == "__main__":
    asyncio.run(main())</code>

이 코드는 단일 스레드 내에서 하위 프로세스를 동시에 실행하는 방법을 보여줍니다.

이러한 접근 방식을 구현하면 여러 ' 고양이 | zgrep' 명령을 원격 서버에서 병렬로 실행합니다.

위 내용은 여러 개의 \'cat를 실행하는 방법 | zgrep\' 명령이 Python에서 동시에 실행됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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