在Python ZMQ publisher/subscriber示例模板中,发布者使用连接到绑定IP地址的.bind()
方法,订阅者使用.connect()
方法。
但是我们可以用另一个替换.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')
发布于 2017-11-27 03:46:23
操作级别差异,没有。
.bind()
方法不需要知道的实际地址(使用通配符扩展技巧等),.connect()
方法必须知道它将开始尝试.connect()
-to的目标地址。
传输类/可伸缩的正式通信模式原型-在某些情况下,对于适当的原型服务来说,实例化/成为RTO的某种顺序是强制性的,所以,是的,存在差异,当一个.bind()
必须更早成为RTO时,在任何远程.connect()
可能有成功的机会之前。
附加功能-可用于配置.bind()
side的特定功能-是最后一组主要差异,其中一些较新的ZeroMQ API版本3.2+开始为.bind()
-side节点添加一些新的访问控制和类似的防御选项,以便在进入公共互联网暴露的操作方式时帮助管理过多的风险。
https://stackoverflow.com/questions/47495910
复制相似问题