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を行う際の基本を押さえておきましょう。
コメント