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命令で終了します。
アウトラインは概ねこんな感じです。