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

发布于 2021-01-29 16:14:44

在Python ZMQ 发布者/订阅者 样本模板中,发布者使用 .bind()
方法,而订阅者使用.connect()方法,该方法连接到绑定IP地址。

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

我的问题是,以下确定的两种情况之间有什么区别?
(在这种情况下,两个脚本可以正常工作)

第一种情况,默认情况下:

pub1.py:

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:

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:

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:

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')
关注者
0
被浏览
45
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    此处(单个发布者和订阅者)没有区别,但是在其他情况下(多个发布者或订阅者),根据您的策略存在区别:

    1. 即假设有两个客户( Machine1Machine2 )和一个 Server
      每个客户端必须使用来发布数据 ZMQ ,并且 服务器 必须从 Machine1Machine2 订阅该数据:

      • Machine1- >具有 发布者 (带有.connect(Server IP)

      • Machine2- >具有 发布者 (带有.connect(Server IP)

      • 服务器 ->具有 订阅者 (带有.bind(Server IP/Self IP)

    正如您在提到的场景中看到的那样,我们在问题中使用第二种情况。

    1. 而如果我们有两个订阅者和一个发布者,则必须将.bind()方法放置在发布者中,并将.connect()方法放置在订阅者中(问题中的第一种情况)。

    [ 注意 ]:



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看