Pythonのsubprocessとmultiprocessingの比較と使い方

この記事ではPythonの`subprocess`モジュールと`multiprocessing`モジュールについて、それぞれの特性と使い方を深堀りしていきます。コード例やその詳細な解説、さらには応用例も含めてご紹介します。これらのモジュールはプロセスを扱う上で非常に便利であり、その選定によってプログラムの効率が大きく変わる可能性があります。

目次

`subprocess`モジュール

`subprocess`モジュールは外部プロセスを作成、入出力を操作、そしてその終了ステータスを待つための機能を提供します。

基本的な使い方

`sCode`
import subprocess

# コマンドラインで「ls」コマンドを実行する例
result = subprocess.run([‘ls’], capture_output=True, text=True)
print(result.stdout)

このコードは、UNIX系の`ls`コマンドを実行して、その結果を変数`result`に格納します。`capture_output=True`により、標準出力と標準エラー出力をキャプチャします。`text=True`は出力をテキスト形式で受け取るためのオプションです。

応用例1: パイプ処理

`sCode`
# lsとgrepをパイプでつなぐ例
p1 = subprocess.Popen([‘ls’], stdout=subprocess.PIPE)
p2 = subprocess.Popen([‘grep’, ‘.py’], stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()
output = p2.communicate()[0]
print(output.decode(‘utf-8’))

この応用例では、`ls`コマンドの出力を`grep`コマンドにパイプしています。`Popen`クラスを使用して各プロセスを生成し、`stdout=subprocess.PIPE`と`stdin=p1.stdout`でパイプを接続しています。

`multiprocessing`モジュール

`multiprocessing`モジュールは並行処理を行うための機能を提供します。主にCPUバウンドなタスクに有用です。

基本的な使い方

`sCode`
from multiprocessing import Process

def print_func(continent=’Asia’):
print(f’The name of continent is : {continent}’)

# Processクラスのインスタンスを生成
p1 = Process(target=print_func, args=(‘America’,))
p1.start()
p1.join()