首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何与pyzmq一起使用inproc传输?

如何与pyzmq一起使用inproc传输?
EN

Stack Overflow用户
提问于 2018-02-02 14:17:35
回答 2查看 3.5K关注 0票数 3

我用pyzmq设置了两个模拟发布和订阅过程的小脚本。但是,我无法使用inproc传输将消息发送到订阅服务器客户端。我可以很好地使用tcp://127.0.0.1:8080,只是不能使用inproc。

pub_server.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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的评论。我仍然没有收到我发表的字符串--我做错了什么?

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

发布于 2018-02-02 14:40:08

顾名思义,inproc套接字只能在同一进程中使用。如果要重写客户端和服务器,使同一进程中有两个线程,则可以使用inproc,但否则这种套接字类型根本不适合您所做的工作。

文档在这一点上非常清楚:

进程内传输在共享单个The上下文的线程之间直接通过内存传递消息。

更新

查看更新后的代码,首先突出的问题是,尽管上面引用的文档显示"...between线程共享单个MQ上下文“,但您在代码中创建了两个上下文。通常,您将只在程序中调用zmq.Context() 一次

接下来,您从不向订阅者订阅任何消息,因此即使其他所有内容都正常工作,您也不会实际收到任何消息。

最后,您的代码将体验慢速接合问题

关于PUB子套接字还有一件更重要的事情要知道:您不知道订阅者何时开始接收消息。即使启动订阅服务器,等待一段时间,然后启动发布服务器,订阅服务器也始终会忽略发布服务器发送的第一条消息。这是因为当订阅服务器连接到发布服务器(需要较小但非零的时间)时,发布者可能已经在发送消息。

pub/sub模型不是用于单个消息的,也不是用于可靠传输的。

因此,总括而言:

  • 在创建套接字之前,需要创建一个共享的ZMQ上下文。
  • 您可能希望您的发布者在循环中发布,而不是发布单个消息。由于您试图使用inproc套接字,所以需要将两个函数放在单独的线程中。
  • 您需要设置订阅筛选器才能接收消息。

ZMQ文档中有一个插座,它可能提供一个有用的起点。PAIR套接字是为在inproc套接字上协调线程而设计的,与pub/sub套接字不同,它们是双向的,不受“慢速合并”问题的影响。

票数 8
EN

Stack Overflow用户

发布于 2021-07-15 13:51:31

正如@larsks前面提到的,上下文对象应该是相同的。全局声明上下文对象,并在pub和sub函数中使用它,而不是为每个函数创建新对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48584598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档