現在、自分の zeromq アプリケーションをテストする可能性を探っています。パブリッシャー/サブスクライバーを同じスレッドに配置して、メッセージを失うことなくパブリッシャーにパブリッシュさせ、サブスクライバーにサブスクライブさせることができるという印象を受けました。しかし、パブリッシャーにいくつかのメッセージを送信させると、サブスクライバーには何も届きません。
私が使用するコードは次のとおりです。
import zmq
def main():
ctx = zmq.Context.instance()
sender = ctx.socket(zmq.PUB)
sender.setsockopt(zmq.HWM, 1000)
sender.bind('tcp://*:10001')
rcvr = ctx.socket(zmq.SUB)
rcvr.setsockopt(zmq.HWM, 1000)
rcvr.connect('tcp://127.0.0.1:10001')
rcvr.setsockopt(zmq.SUBSCRIBE, "")
for i in range(100):
sender.send('%i' % i)
while True:
try:
print rcvr.recv(zmq.NOBLOCK)
except zmq.ZMQError:
break
if __name__ == '__main__':
main()
これを実行すると、出力が得られません。
私が驚くのは、送信者が送信する前に受信者が接続されているため、これらのメッセージをキューに入れる必要があるということです。それとも、それは明らかに間違っている仮定であり、代わりに PUSH/PULL を使用する必要がありますか?