ホームページ >バックエンド開発 >Python チュートリアル >複数の \'cat | を実行する方法zgrep\' コマンドを Python で同時に実行しますか?

複数の \'cat | を実行する方法zgrep\' コマンドを Python で同時に実行しますか?

DDD
DDDオリジナル
2024-10-27 07:09:29355ブラウズ

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

複数の 'cat | を実行zgrep' コマンドを同時に実行

この Python スクリプトでは、複数の 'cat | zgrep' コマンドが同時に実行されます。 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>

このコードはサブプロセスを並列で実行し、スレッドを使用してその出力を同時に収集します。

非同期ベースの並列実行

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。