はじめに
Python でプロセス間通信を行う方法を色々と探してみたが、これはという方法が見当たりませんでした。
Queueを使った方法では、作成したQueue オブジェクトを渡す必要があり、独立したプロセス間ではできません。
そこで、ソケットを使った通信にて実現することにしました。
具体的に
ここでは、同一ホスト上で稼働するプログラム間の通信をするので、ホストは、'localhost'を指定します。
受信側
受信側では、ソケットをオープンして、送信側からのデータ受信を待ちます。通常は、テキストを受け取りますが、制御文字として「キャンセル」、「処理終了」を受け取るようにしました。
comrcv.py
from socket import socket, AF_INET, SOCK_STREAM
HOST = 'localhost'
PORT = 51000
MAX_MESSAGE = 2048
NUM_THREAD = 4
CHR_CAN = '\18'
CHR_EOT = '\04'
def com_receive():
# 通信の確立
sock = socket(AF_INET, SOCK_STREAM)
sock.bind ((HOST, PORT))
sock.listen (NUM_THREAD)
print ('receiver ready, NUM_THREAD = ' + str(NUM_THREAD))
# メッセージ受信ループ
while True:
try:
conn, addr = sock.accept()
mess = conn.recv(MAX_MESSAGE).decode('utf-8')
conn.close()
# 終了要求?
if (mess == CHR_EOT):
break
# キャンセル?
if (mess == CHR_CAN):
print('cancel')
continue
# テキスト
print ('message:' + mess)
except:
print ('Error:' + mess)
# 通信の終了
sock.close()
print ('end of receiver')
def proc():
com_receive()
実行は、comrcv.proc() です。'receiver ready'を表示した後、メッセージの受信待ちになり、受信した内容を表示します。
そして、終了要求を受け取るとループを抜けて、ソケットをクローズし、処理を終了します。
送信側
送信側では、テキストを送信するたびにソケットをオープンし、テキストを送信します。
comsnd.py
from socket import socket, AF_INET, SOCK_STREAM
HOST = 'localhost'
PORT = 51000
CHR_CAN = '\18'
CHR_EOT = '\04'
def com_send(mess):
while True:
try:
# 通信の確立
sock = socket(AF_INET, SOCK_STREAM)
sock.connect((HOST, PORT))
# メッセージ送信
sock.send(mess.encode('utf-8'))
# 通信の終了
sock.close()
break
except:
print ('retry: ' + mess)
def proc():
com_send('message test')
def exit():
com_send(CHR_EOT)
def cancel():
com_send(CHR_CAN)
実行は、comsnd.proc()で、'message text'を送信します。また、comsnd.cancel()でキャンセル文字、comsnd.exit()で処理終了のコードを送信します。