【python】ZeroMQのPUBSUB通信ができない

ソフトウェア

 

pythonでZeroMQを使う機会があったのですが、PubSub通信がうまく動かないケースがありました。

解決済みなので共有します。

 

 

Publisher

 

publisherなのでデータを提供する側です。

他のWebページにもよくあるソースコードを参照して書いています。

今回送信するデータは文字列などではなく、オブジェクトデータです。

 

import zmqimport 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ですが、サーバレスでプロセス間のデータ転送を簡易に実現できるのでおススメかなぁと思いました。

小規模なシステムでデータ受け渡しをするときにサクッと実装できて便利ですね!

 

以上!!

 

 

コメント