将ZMQ PUB与.connect()或.bind()方法一起使用有什么区别?
在Python ZMQ 样本模板中,发布者使用
方法,而订阅者使用.connect()
方法,该方法连接到绑定IP地址。
但是,我们可以更换.bind()
,并.connect()
各自与其他。
我的问题是,以下确定的两种情况之间有什么区别?
(在这种情况下,两个脚本可以正常工作)
第一种情况,默认情况下:
import zmqimport 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)
import zmqif __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()
方法的使用:
import zmqimport 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)
import zmqif __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')
回答:
此处(单个发布者和订阅者)没有区别,但是在其他情况下(多个发布者或订阅者),根据您的策略存在区别:
即假设有两个客户( Machine1 , Machine2 )和一个 Server 。
每个客户端必须使用来发布数据 ,并且 服务器 必须从 Machine1 和 Machine2 订阅该数据:
Machine1- >具有 (带有
.connect(Server IP)
)Machine2- >具有 (带有
.connect(Server IP)
)服务器 ->具有 (带有
.bind(Server IP/Self IP)
)
正如您在提到的场景中看到的那样,我们在问题中使用第二种情况。
- 而如果我们有两个订阅者和一个发布者,则必须将
.bind()
方法放置在发布者中,并将.connect()
方法放置在订阅者中(问题中的第一种情况)。
[ ]:
.bind()
method不支持将localhost
IP作为IP,而.connect()
method可以连接到.bind()
method中定义的每个IP地址: 为什么zeromq在localhost上不起作用?
以上是 将ZMQ PUB与.connect()或.bind()方法一起使用有什么区别? 的全部内容, 来源链接: utcz.com/qa/407583.html