LoginSignup
29
36

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-05-06

はじめに

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

29
36
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
36