ホームページ  >  記事  >  バックエンド開発  >  \'cat | の同時実行を実現するにはどうすればよいですか? Python で zgrep\' コマンドを実行しながら、さらなる処理のために個々の出力を効率的に管理できますか?

\'cat | の同時実行を実現するにはどうすればよいですか? Python で zgrep\' コマンドを実行しながら、さらなる処理のために個々の出力を効率的に管理できますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-27 07:04:03288ブラウズ

How can you achieve concurrent execution of 'cat | zgrep' commands in Python while efficiently managing individual output for further processing?

Python: 'cat' サブプロセスの同時実行

並列処理シナリオでは、順次実行がボトルネックになる可能性があります。この問題を回避するには、複数の 'cat | を実行する方法を調べてください。 zgrep' コマンドを Python で同時に実行しながら、個別の出力をさらなる処理のために保持します。

サブプロセス モジュールとの同時実行

マルチプロセッシングやスレッド化に頼らずにサブプロセスを同時実行するには、次のアプローチを検討してください。

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

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

# Gather execution statuses
exitcodes = [p.wait() for p in processes]</code>

このコードは、'&' や明示的な '.wait()' 呼び出しを必要とせずに、5 つのシェル コマンドを並行して起動します。

スレッド プールとの同時実行

同時サブプロセス出力収集用、スレッドを使用できます:

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

# Create processes
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 output
def get_lines(process):
    return process.communicate()[0].splitlines()

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

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

非同期出力コレクション (Python 3.8)

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():
    # Concurrent command execution
    coros = [
        get_lines(
            f'"{sys.executable}" -c "print({i:d}); import time; time.sleep({i:d})"'
        )
        for i in range(5)
    ]
    print(await asyncio.gather(*coros))


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

このコードは、サブプロセスを実行してその出力を非同期に収集し、マルチプロセッシングやスレッド化の必要性を排除します。

以上が\'cat | の同時実行を実現するにはどうすればよいですか? Python で zgrep\' コマンドを実行しながら、さらなる処理のために個々の出力を効率的に管理できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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