Ben*_*ari 5 python bind connect zeromq pyzmq
在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)
Run Code Online (Sandbox Code Playgroud)
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')
Run Code Online (Sandbox Code Playgroud)
第二种情况是修改后的设置,它颠倒了.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)
Run Code Online (Sandbox Code Playgroud)
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')
Run Code Online (Sandbox Code Playgroud)
这里没有区别(单个发布者和订阅者),但在其他场景(多个发布者或订阅者)中,存在差异,具体取决于您的策略:
ZMQ,并且服务器必须从Machine1和Machine2订阅该数据:Machine1 --> 有一个发布者(带有.connect(Server IP))
Machine2 --> 有一个发布者(与.connect(Server IP))
服务器--> 有一个订阅者(with .bind(Server IP/Self IP))
正如您在提到的场景中看到的,我们在问题中使用了第二种情况。
.bind()方法放置在发布者中,并将方法放置.connect()在订阅者中(问题中的第一种情况)。[笔记]:
.bind()方法不支持localhost作为IP,而.connect()方法可以连接到.bind()方法中定义的每个IP地址: 为什么zeromq在本地主机上不起作用?
这是更改.bind()和.connect()定位的另一个示例: This-Link
| 归档时间: |
|
| 查看次数: |
1050 次 |
| 最近记录: |