我已经设置了两个小脚本来模拟 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 传输方法?
编辑:
我已经更新了我的代码以进一步反射(reflect) @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
,否则这种套接字类型根本不适合您正在做的事情。
documentation 在这一点上非常清楚:
更新
看看更新后的代码,首先突出的问题是,虽然上面引用的文档说“...在共享单个 ØMQ 上下文的线程之间”,但您正在代码中创建两个上下文。通常,您只会在程序中调用 zmq.Context()
一次 。
接下来,您永远不会为您的订阅者订阅任何消息,因此即使其他一切正常工作,您实际上也不会收到任何消息。
最后,您的代码将体验 slow joiner problem :
发布/订阅模型并不适用于单个消息,也不是一种可靠的传输方式。
所以,总结一下:
inproc
套接字,因此您需要将两个函数放入单独的线程中。 ZMQ 文档中有一个 example using
PAIR
sockets 可能会提供一个有用的起点。 PAIR
套接字旨在协调 inproc
套接字上的线程,与 pub/sub 套接字不同,它们是双向的,不受“慢连接器”问题的影响。关于python - 如何在pyzmq中使用inproc传输?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48584598/