「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 複数の \'cat | を実行する方法zgrep\' コマンドを Python で同時に実行しますか?

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

2024 年 11 月 4 日に公開
ブラウズ:869

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

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

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

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

非同期ベースの並列実行

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