1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonでsocketを使ったタスク間通信

Posted at

Pythonのタスク間でデータを共有する方法

FlaskやFletのようなフレームワークを使っていると、インポートしたライブラリがうまく動かないものがある。
win32com.clientで起動した、DAOオブジェクトやExcelオブジェクトはFletで起動できなかったため、1対1で動作するタスクとしてDAOとExcelを制御する部分を起動しSocketでタスク間通信を行った。

サーバー側

今回は、低水準ソケットを使ってTCPで通信する

import socket

def aeServ():
    HOST=''
    PORT=5000
    BLEN=1024
    skt=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    #
    def cnloop():
        skt.listen()
        conn, addr = skt.accept()
        cmd = '-'
        while cmd != "close":
            cmdb=conn.recv(BLEN)
            cmd=cmdb.decode()
            if cmd=='cmd':
                # コマンド処理
                # 正常なら
                conn.sendall(b'OK')
            #
            if cmd=='close':
                # 後処理
                # 正常なら
                conn.sendall(b'OK')
    #
    cnloop()

ポート番号は、元来Linuxの/etc/servicesで定義されていないものを使い、WindowsではC:\windows\system32\drivers\etcにservicesがあり記載されていないポートを使います。HOSTにIPアドレスやホスト名がなければlocalhost(127.0.0.1)になります。
このプログラムではコマンドとしてcloseを受信すると待受ループから抜けます。

クライアント側

クライアント側は、

import socket
import json

HOST = '127.0.0.1'  # サーバーのホスト名
PORT = 5000         # サーバーのポート番号

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.sendall(b'cmd')
    data = s.recv(1024)
    print('Received', data.decode())
    s.sendall('close'.encode())
    data = s.recv(1024)
    print('Received', data.decode())
    #

cmdを送り、サーバー側のレスポンスを受けてclose命令で終了します。
アウトラインは概ねこんな感じです。

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?