"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 여러 개의 \'cat를 실행하는 방법 | zgrep\' 명령이 Python에서 동시에 실행됩니까?

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

2024-11-04에 게시됨
검색:315

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

여러 'cat 실행 | zgrep' 명령 동시 실행

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

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

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

#!/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]

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

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

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

#!/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)

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

Asyncio 기반 병렬 실행

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

#!/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())

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

이러한 접근 방식을 구현하면 여러 실행을 통해 스크립트의 효율성을 크게 향상시킬 수 있습니다. '고양이 | 원격 서버에서 병렬로 zgrep' 명령을 실행합니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3