我已经设置了两个小脚本来模仿 pyzmq 的发布和订阅过程。但是,我无法使用inproc
运输。我能够使用tcp://127.0.0.1:8080
好吧,只是不是 inproc。
pub_server.py
import zmq
import random
import sys
import time
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("inproc://stream")
while True:
socket.send_string("Hello")
time.sleep(1)
子客户端.py
import sys
import zmq
# Socket to talk to server
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.setsockopt_string(zmq.SUBSCRIBE, '')
socket.connect("inproc://stream")
for x in range (5):
string = socket.recv()
print(string)
如何成功更改代码以便能够在两个脚本之间使用 inproc 传输方法?
EDIT:
我已经更新了我的代码以进一步反映@larsks 评论。我仍然没有收到我发布的字符串 - 我做错了什么?
import threading
import zmq
def pub():
context = zmq.Context()
sender = context.socket(zmq.PUB)
sender.connect("inproc://hello")
lock = threading.RLock()
with lock:
sender.send(b"")
def sub():
context = zmq.Context()
receiver = context.socket(zmq.SUB)
receiver.bind("inproc://hello")
pub()
# Wait for signal
string = receiver.recv()
print(string)
print("Test successful!")
receiver.close()
if __name__ == "__main__":
sub()
顾名思义,inproc
只能使用套接字在同一进程内。如果您要重写客户端和服务器,以便同一进程中有两个线程,您可以使用inproc
,但否则这种套接字类型根本不适合您正在做的事情。
The 文档 http://api.zeromq.org/2-1:zmq-inproc关于这一点,非常明确:
进程内传输通过内存直接在共享单个 ØMQ 上下文的线程之间传递消息。
Update
看一下更新后的代码,首先突出的问题是,虽然上面引用的文档说“...共享单个 ØMQ 上下文的线程之间”,但您正在创建two代码中的上下文。通常,您只会调用zmq.Context()
once在你的程序中。
接下来,您永远不会向您的订阅者订阅任何消息,因此即使其他一切正常工作,您实际上也不会收到任何消息。
最后,您的代码将体验到慢加入问题 http://zguide.zeromq.org/page:all#Getting-the-Message-Out:
关于 PUB-SUB 套接字,需要了解一件更重要的事情:您无法准确知道订阅者何时开始获取消息。即使您启动订阅者,等待一段时间,然后启动发布者,订阅者也总是会错过发布者发送的第一条消息。这是因为当订阅者连接到发布者时(需要很短但非零的时间),发布者可能已经在发送消息了。
发布/订阅模型不适用于单个消息,也不是可靠的传输。
所以,总结一下:
- 在创建套接字之前,您需要创建共享 ZMQ 上下文。
- 您可能希望发布者循环发布而不是发布单个消息。既然你正在尝试使用
inproc
您需要将两个函数放入单独的线程中的套接字。
- 您需要设置订阅过滤器才能接收消息。
有一个示例使用PAIR sockets http://zguide.zeromq.org/py:mtrelayZMQ 文档中可能提供一个有用的起点。PAIR
套接字设计用于协调线程inproc
套接字,与发布/订阅套接字不同,它们是双向的,并且不受“缓慢连接”问题的影响。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)