首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将ZMQ与.connect()或.bind()方法一起使用有什么区别?

将ZMQ与.connect()或.bind()方法一起使用有什么区别?
EN

Stack Overflow用户
提问于 2017-11-26 19:59:16
回答 1查看 2.4K关注 0票数 5

在Python ZMQ publisher/subscriber示例模板中,发布者使用连接到绑定IP地址的.bind()方法,订阅者使用.connect()方法。

但是我们可以用另一个替换.bind().connect()

我的问题是,下面确定的两个案例之间的区别是什么?

(在这些情况下,有两个脚本可以正常工作)

第一种情况,默认为:

pub1.py:

代码语言:javascript
运行
复制
import zmq
import time
from datetime import datetime

def create_pub_socket():
    context = zmq.Context()
    socket = context.socket(zmq.PUB)
    socket.bind("tcp://127.0.0.1:9002")  # notice
    return socket

def publish(pub_socket):
    message = {
        'data': 'hi my name is benyamin',
        'time': datetime.now().strftime('%Y-%m-%dT%H:%M:%S')
    }
    pub_socket.send_json(message, 0)
    return message

if __name__ == '__main__':
    socket = create_pub_socket()

    while True:
        print('\n')
        print('publisher: ', publish(socket))
        time.sleep(1)

sub1.py:

代码语言:javascript
运行
复制
import zmq

if __name__ == '__main__':
    context = zmq.Context()
    socket = context.socket(zmq.SUB)
    socket.setsockopt(zmq.SUBSCRIBE, "")
    socket.connect("tcp://127.0.0.1:9002")  # notice

    while True:
        data = socket.recv_json()
        print('subscriber: ', data)
        print('\n')

第二种情况是修改后的设置,它颠倒了.connect().bind()方法的使用:

pub2.py:

代码语言:javascript
运行
复制
import zmq
import time
from datetime import datetime

def create_pub_socket():
    context = zmq.Context()
    socket = context.socket(zmq.PUB)
    socket.connect("tcp://127.0.0.1:9002")  # notice
    return socket

def publish(pub_socket):
    message = {
        'data': 'hi my name is benyamin',
        'time': datetime.now().strftime('%Y-%m-%dT%H:%M:%S')
    }
    pub_socket.send_json(message, 0)
    return message

if __name__ == '__main__':
    socket = create_pub_socket()

    while True:
        print('\n')
        print('publisher: ', publish(socket))
        time.sleep(1)

sub2.py:

代码语言:javascript
运行
复制
import zmq

if __name__ == '__main__':
    context = zmq.Context()
    socket = context.socket(zmq.SUB)
    socket.setsockopt(zmq.SUBSCRIBE, "")
    socket.bind("tcp://127.0.0.1:9002")  # notice

    while True:
        data = socket.recv_json()
        print('second subscriber: ', data)
        print('\n')
EN

回答 1

Stack Overflow用户

发布于 2017-11-27 03:46:23

操作级别差异,没有。

.bind()方法不需要知道的实际地址(使用通配符扩展技巧等),.connect()方法必须知道它将开始尝试.connect()-to的目标地址。

传输类/可伸缩的正式通信模式原型-在某些情况下,对于适当的原型服务来说,实例化/成为RTO的某种顺序是强制性的,所以,是的,存在差异,当一个.bind()必须更早成为RTO时,在任何远程.connect()可能有成功的机会之前。

附加功能-可用于配置.bind() side的特定功能-是最后一组主要差异,其中一些较新的ZeroMQ API版本3.2+开始为.bind()-side节点添加一些新的访问控制和类似的防御选项,以便在进入公共互联网暴露的操作方式时帮助管理过多的风险。

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

https://stackoverflow.com/questions/47495910

复制
相关文章

相似问题

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