pythonでZeroMQを使う機会があったのですが、PubSub通信がうまく動かないケースがありました。
解決済みなので共有します。
Publisher
publisherなのでデータを提供する側です。
他のWebページにもよくあるソースコードを参照して書いています。
今回送信するデータは文字列などではなく、オブジェクトデータです。
import zmq
import threading class PubServer: def __init__(self, queue): self.context = zmq.Context() self.socket = self.context.socket(zmq.PUB) self.socket.bind('tcp://*:5556') self.queue = queue self.pub_thread = threading.Thread(target=self._pub_thread) self.pub_thread.start() def _pub_thread(self): while True: data = # 何かしらのオブジェクト self.socket.send_pyobj(data)
Subscriber
続いてデータを受け取る(購読する)側です。
注目すべき点は、socketを初期化した後、setsockopt(zmq.SUBSCRIBE, b”)している点です。
正確な理由は不明ですが、この1行がないとデータをうまく受信できません。
おそらく、データをbyte配列として受信する際のおまじないなのだと思います。
class SubClient:
def __init__(self, queue): self.context = zmq.Context() self.socket = self.context.socket(zmq.SUB) self.socket.setsockopt(zmq.SUBSCRIBE, b'') self.socket.connect('tcp://localhost:5556') self.queue = queue self.sub_thread = threading.Thread(target=self._recv_data) self.sub_thread.start() def _recv_data(self): while True: data = self.socket.recv_pyobj()
まとめ
pythonでZeroMQを使う場合の細かな設定の紹介でした。
ZeroMQですが、サーバレスでプロセス間のデータ転送を簡易に実現できるのでおススメかなぁと思いました。
小規模なシステムでデータ受け渡しをするときにサクッと実装できて便利ですね!
以上!!
コメント