有什么用ZMQ PUB与.connect()或.bind()方法之间的区别?

问题描述 投票:5回答:2

在Python ZMQ发布/订阅的示例模板,发布商使用.bind()方法和用户使用.connect()方法,连接到所述绑定IP地址。

但是,我们可以更换.bind(),并与其他.connect()每个。

我的问题是,什么是两种情况之下确定的区别? (在这种情况下两个脚本做工精细)

第一种情况下,默认:

普遍1.朋友:

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)

苏北1.朋友:

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()方法:

普遍2.朋友:

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)

苏北2.朋友:

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')
python bind zeromq connect pyzmq
2个回答
2
投票

在这里,但在其他情况下,有差异无显着差异取决于你的政策:

即假设有两个客户端(MACHINE1,机器2)和服务器。 每个客户端必须使用ZMQ公布的数据,服务器必须订阅来自MACHINE1和机器2数据:

  • MACHINE1 - >有一个发布者(与.connect(Server IP)
  • 机器2 - >有一个发布者(与.connect(Server IP)
  • 服务器 - >有一个用户(与.bind(Server IP/Self IP)

正如你可以在场景中提到的,我们看到在第二种情况下使用(在提到的问题)。


[注意]:


1
投票

操作高度差的,没有。

设置视角差异 - .bind()方法不需要知道实际的地址(使用通配符expansio技巧等),.connect()方法必须知道目标地址,它会开始尝试.connect()到。

交通运输类/可扩展的正式沟通模式的原型 - 有这样的情况,实例化时,一些订单/成为RTO是强制性的正确原型的服务,所以,是的,有差异,当一个人,.bind()已经变得更早RTO,任何远程前.connect()可能有成功的机会。

附加可用于配置.bind()侧具体特点 - 是的差异,其中3.2+开始有些更近ZeroMQ API的版本增加了一些新的访问控制和类似的防御方案供.bind()端节点的最后一个主集,从而帮助管理,一旦进入公共互联网曝光手法的风险太多了。

© www.soinside.com 2019 - 2024. All rights reserved.