次のメソッドは、Python のプロセス間通信によく使用されます。
1. キュー(Queue) 複数のプロセスがデータのやり取りにキューを使用します。プロセスはキューを介してオブジェクトを送受信します。
キューはあらゆる種類のデータを格納でき、マルチスレッド操作をサポートするデータ構造であるため、Python のマルチプロセス プログラミングではキューを使用してプロセス間通信を実装できます。
以下は、キューを使用してプロセス間通信を実装する簡単なサンプル コードです。
import multiprocessing
def producer(queue):
for i in range(10):
queue.put(i)
def consumer(queue):
while True:
item = queue.get()
if item is None:
break
print(item)
if __name__ == '__main__':
queue = multiprocessing.Queue()
p1 = multiprocessing.Process(target=producer, args=(queue,))
p2 = multiprocessing.Process(target=consumer, args=(queue,))
p1.start()
p2.start()
p1.join()
queue.put(None)
p2.join()
このサンプル コードでは、キューへのデータの書き込みとキューからのデータの読み取りにそれぞれ使用される、プロデューサーとコンシューマーの 2 つの関数を定義します。キューを初期化し、2 つのプロセス p1 と p2 を作成しました。p1 はプロデューサー関数の実行に使用され、p2 はコンシューマー関数の実行に使用されます。
2. パイプライン(Pipe) パイプラインは、2 つのプロセス間の片方向通信など、アフィニティのあるプロセス間の通信に使用できます。
パイプはプロセス間通信の手段でもあり、通常のパイプ(親プロセスと子プロセスの間でのみ使用できる)と名前付きパイプ(複数のプロセス間で使用できる)に分けられます。
以下は、パイプを使用してプロセス間通信を実装する簡単なサンプル コードです。
import multiprocessing
def producer(pipe):
for i in range(10):
pipe.send(i)
pipe.close()
def consumer(pipe):
while True:
try:
item = pipe.recv()
print(item)
except EOFError:
break
if __name__ == '__main__':
pipe = multiprocessing.Pipe()
p1 = multiprocessing.Process(target=producer, args=(pipe[0],))
p2 = multiprocessing.Process(target=consumer, args=(pipe[1],))
p1.start()
p2.start()
p1.join()
p2.join()
このサンプル コードでは、パイプラインを作成し、2 つのプロセス p1 と p2 を開始します。p1 はプロデューサー関数の実行に使用され、p2 はコンシューマー関数の実行に使用されます。プロデューサー関数ではパイプラインにデータを送信し、パイプラインを閉じます。コンシューマー関数では、EOFError 例外が発生するまでパイプラインからデータを読み取り続けます。
3. 共有メモリ プロセスは共有メモリ セグメントを定義でき、複数のプロセスが同じメモリ空間にアクセスしてデータ共有を実現できます。値や配列などの同期メカニズムを使用する必要があります。
共有メモリは、データ共有の目的を達成するために、複数のプロセスが同じメモリ領域にアクセスできるようにする、非常に効率的なプロセス間通信方法です。
以下は、共有メモリを使用したプロセス間通信の簡単なサンプル コードです。
import multiprocessing
def producer(shared_value):
for i in range(10):
shared_value.value = i
def consumer(shared_value):
while True:
print(shared_value.value)
if __name__ == '__main__':
shared_value = multiprocessing.Value('i', 0)
p1 = multiprocessing.Process(target=producer, args=(shared_value,))
p2 = multiprocessing.Process(target=consumer, args=(shared_value,))
p1.start()
p2.start()
p1.join()
p2.join()
このサンプルコードでは、プロデューサー関数とコンシューマー関数の 2 つの関数を定義します。プロデューサー関数は共有メモリへのデータの書き込みに使用され、コンシューマー関数は共有メモリからのデータの読み取りに使用されます。multiprocessing.Value を使用して共有メモリ オブジェクトを作成し、それを両方のプロセスに渡します。プロデューサー関数では共有メモリの値を常に変更し、コンシューマ関数では共有メモリの値をループで読み取って出力します。
4. メッセージ キュー (Message Queue) メッセージ キュー インターフェイスを介してメッセージをキューに入れ、キューからメッセージを取得します。キューはメッセージを他のプロセスに渡します。
5. セマフォ(Semaphore)は、プロセス間や同一プロセス内の異なるスレッド間の信号伝達に使用され、信号を送受信することができます。
セマフォは、プロセスの相互排他やプロセスの同期など、複数のプロセス間の同期制御に利用できます。
以下は、セマフォを使用してプロセス間通信を実装する簡単なコード例です。
import multiprocessing
def producer(queue, sem):
for i in range(10):
sem.acquire()
queue.put(i)
def consumer(queue, sem):
while True:
item = queue.get()
print(item)
sem.release()
if __name__ == '__main__':
queue = multiprocessing.Queue()
sem = multiprocessing.Semaphore(1)
p1 = multiprocessing.Process(target=producer, args=(queue, sem))
p2 = multiprocessing.Process(target=consumer, args=(queue, sem))
p1.start()
p2.start()
p1.join()
p2.join()
このサンプル コードでは、プロデューサーとコンシューマーの 2 つの関数を定義します。プロデューサー関数はキューにデータを書き込むために使用され、コンシューマー関数はキューからデータを読み取るために使用されます。multiprocessing.Semaphore を使用してセマフォを作成し、その初期値を 1 に設定します。プロデューサー関数では、sem.acquire() メソッドを通じてセマフォを申請します。申請できる場合はキューにデータを書き込み、そうでない場合は無期限に待機します。コンシューマ関数では、キューからデータを読み取りますrelease() メソッドはセマフォを解放します。
6. ソケット (Socket) プロセスは、ネットワーク インターフェイスを介したクライアントとサーバーと同様に、ネットワーク ソケットを介して通信できます。
適切な通信メカニズムを選択することで、Python プロセス間でデータ交換と通信を実行できます。マルチプロセッシング モジュールは、プロセス間通信をサポートするさまざまなコンポーネントを提供します。