gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:19:21 25 4
gpt4 key购买 nike

在 Python ZMQ publisher/subscriber 示例模板中,发布者使用 .bind() 方法,订阅者使用 .connect ()方法,连接到绑定(bind)的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')

最佳答案

这里没有区别(单发布者和订阅者),但在其他场景(多发布者或订阅者),根据你的策略有区别:

  1. 即假设有两个客户端(Machine1Machine2)和一个Server
    每个客户端必须使用 ZMQ 发布数据,Server 必须从 Machine1Machine2 订阅数据:
  • Machine1 --> 有一个发布者(带有.connect(Server IP))

  • Machine2 --> 有一个发布者(使用.connect(Server IP))

  • Server --> 有一个subscriber (with .bind(Server IP/Self IP))

如您所见,在上述场景中我们使用了问题中的第二种情况。

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

[注意]:

  • .bind() 方法不支持 localhost 作为 IP,而 .connect()方法可以连接到在 .bind() 方法中定义的每个 IP 地址:Why doesn't zeromq work on localhost?

  • 这是另一个改变.bind().connect() 的例子 locate: This-Link

关于python - 将 ZMQ PUB 与 .connect() 或 .bind() 方法一起使用有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47495910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com