我用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)sub_client.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传输方法?
编辑:
我更新了我的代码,以进一步反映@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()发布于 2018-02-02 14:40:08
顾名思义,inproc套接字只能在同一进程中使用。如果要重写客户端和服务器,使同一进程中有两个线程,则可以使用inproc,但否则这种套接字类型根本不适合您所做的工作。
文档在这一点上非常清楚:
进程内传输在共享单个The上下文的线程之间直接通过内存传递消息。
更新
查看更新后的代码,首先突出的问题是,尽管上面引用的文档显示"...between线程共享单个MQ上下文“,但您在代码中创建了两个上下文。通常,您将只在程序中调用zmq.Context() 一次。
接下来,您从不向订阅者订阅任何消息,因此即使其他所有内容都正常工作,您也不会实际收到任何消息。
最后,您的代码将体验慢速接合问题
关于PUB子套接字还有一件更重要的事情要知道:您不知道订阅者何时开始接收消息。即使启动订阅服务器,等待一段时间,然后启动发布服务器,订阅服务器也始终会忽略发布服务器发送的第一条消息。这是因为当订阅服务器连接到发布服务器(需要较小但非零的时间)时,发布者可能已经在发送消息。
pub/sub模型不是用于单个消息的,也不是用于可靠传输的。
因此,总括而言:
inproc套接字,所以需要将两个函数放在单独的线程中。ZMQ文档中有一个插座,它可能提供一个有用的起点。PAIR套接字是为在inproc套接字上协调线程而设计的,与pub/sub套接字不同,它们是双向的,不受“慢速合并”问题的影响。
发布于 2021-07-15 13:51:31
正如@larsks前面提到的,上下文对象应该是相同的。全局声明上下文对象,并在pub和sub函数中使用它,而不是为每个函数创建新对象。
https://stackoverflow.com/questions/48584598
复制相似问题