Python
プロセス間通信
ソケット通信

Python で独立したプロセス間の通信をやってみる

はじめに

 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()で処理終了のコードを送信します。