Pythonでプロセス間通信(IPC)の基本を理解する

Pythonでのプロセス間通信(Inter-Process Communication, IPC)について解説します。本記事では、Pythonでよく用いられるIPCメカニズムであるソケット通信とパイプラインの基本について、具体的なコード例とその解説、応用例を含めています。

目次

プロセス間通信(IPC)とは?

プロセス間通信(IPC)とは、独立したプロセス同士がデータをやり取りするための手段のことです。IPCは、ソフトウェア開発においてマルチプロセスやマイクロサービスアーキテクチャの実装に不可欠な要素です。

PythonでのIPCの方法

Pythonでは、主にソケット通信とパイプラインが用いられます。

ソケット通信

ソケット通信は、ネットワークを介してデータを送受信するための仕組みです。

基本的なソケット通信のコード例

import socket

# サーバー側
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 5000))
server_socket.listen(1)

conn, addr = server_socket.accept()
data = conn.recv(1024)
print(f'受信データ: {data.decode()}')  # 受信データをデコードして表示
conn.close()

# クライアント側
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 5000))
client_socket.sendall(b'Hello, Server!')
client_socket.close()

ソケット通信の解説

– `socket.socket()`: ソケットオブジェクトを生成します。
– `bind()`: IPアドレスとポート番号を指定して、ソケットにバインドします。
– `listen()`: クライアントからの接続を待ちます。
– `accept()`: クライアントからの接続を受け付けます。
– `recv()`: データを受信します。
– `sendall()`: データを送信します。

パイプライン

パイプラインは、同一マシン上のプロセス間でデータを送受信するための手段です。

基本的なパイプラインのコード例

import os

# パイプを作成
read_fd, write_fd = os.pipe()

# 子プロセスを生成
pid = os.fork()

if pid > 0:
    # 親プロセス
    os.close(read_fd)
    os.write(write_fd, b'Hello, Child!')
    os.close(write_fd)

else:
    # 子プロセス
    os.close(write_fd)
    message = os.read(read_fd, 1024)
    print(f'受信データ: {message.decode()}')
    os.close(read_fd)

パイプラインの解説

– `os.pipe()`: 読み書きのためのファイルディスクリプタを生成します。
– `os.fork()`: 子プロセスを生成します。
– `os.write()`: データを書き込みます。
– `os.read()`: データを読み取ります。

応用例

例1:マルチスレッドでのソケット通信

import socket
import threading

def handle_client(conn):
    data = conn.recv(1024)
    print(f'受信データ: {data.decode()}')
    conn.close()

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 5000))
server_socket.listen(5)

while True:
    conn, addr = server_socket.accept()
    client_thread = threading.Thread(target=handle_client, args=(conn,))
    client_thread.start()

例2:非同期I/Oを使ったパイプライン

import asyncio

async def read_pipe(reader):
    data = await reader.read(100)
    print(f'受信データ: {data.decode()}')

async def write_pipe(writer):
    writer.write(b'Hello, Async Child!')
    await writer.drain()

async def main():
    reader, writer = await asyncio.open_unix_connection('/tmp/my_pipe')
    await asyncio.gather(read_pipe(reader), write_pipe(writer))

asyncio.run(main())

まとめ

プロセス間通信(IPC)は、ソフトウェア開発において非常に重要な概念です。Pythonではソケット通信とパイプラインがよく用いられます。基本的な使い方から応用例まで、PythonでIPCを行う際の基本を押さえておきましょう。

コメント

コメントする

目次