我一直在应用程序中使用PUSH/PULL
模式,该模式可以正常工作,除非我突然关闭计算机或拔下PULL
-side的以太网电缆。PUSH
-side继续与其他PULL
-sockets一起工作,但是保持关闭的套接字状态,好像还活着。
我修改了TCP参数(时间间隔,计数...),但没有结果。
即使关闭主机或拔掉以太网电缆,也可以避免这种连接吗?
编辑:
这是我做过的小测试
server.py
import zmq
import time
context = zmq.Context()
socket = context.socket(zmq.PUSH)
socket.setsockopt(zmq.RCVHWM, 1)
socket.setsockopt(zmq.SNDHWM, 1)
socket.setsockopt(zmq.LINGER, 0)
socket.setsockopt(zmq.IMMEDIATE, 1)
print(socket.sndtimeo)
socket.sndtimeo = 0
socket.setsockopt(zmq.TCP_KEEPALIVE,1)
socket.setsockopt(zmq.TCP_KEEPALIVE_CNT,1)
socket.setsockopt(zmq.TCP_KEEPALIVE_IDLE,1)
socket.setsockopt(zmq.TCP_KEEPALIVE_INTVL,1)
socket.bind('tcp://*:5555')
count= 0
while True:
print('Sending', count)
try:
socket.send(str(count).encode('utf-8'), zmq.NOBLOCK)
count+= 1
print('Ok')
except zmq.error.Again:
print('Error')
time.sleep(0.1)
client.py
import zmq
import time
import sys
#from common import time_utils
context = zmq.Context()
socket = context.socket(zmq.PULL)
server = '127.0.0.1:5555'
try:
server = sys.argv[1]
except IndexError:
pass
socket.setsockopt(zmq.TCP_KEEPALIVE,1)
socket.setsockopt(zmq.TCP_KEEPALIVE_CNT,1)
socket.setsockopt(zmq.TCP_KEEPALIVE_IDLE,1)
socket.setsockopt(zmq.TCP_KEEPALIVE_INTVL,1)
socket.setsockopt(zmq.RCVHWM, 1)
socket.connect(server)
while True:
# Wait for next request from client
message = socket.recv()
print("Received request: ", message)
运行一个服务器实例和2个客户端(一个在运行服务器的同一台计算机上,另一个在另一台计算机上)。卸下第二台计算机的以太网电缆会导致服务器保持一段时间向第二个客户端发送消息。
如您所见,我已经测试了所有
setsockopt
。
最佳答案
尝试使用ZMTP ping/pong选项。当它们以比TCP套接字更高的级别运行时,它们应该检测到连接丢失(可以在连接断开后保持打开状态)ZMQ_HEARTBEAT_IVL, ZMQ_HEARTBEAT_TIMEOUT and ZMQ_HEARTBEAT_TTL
http://api.zeromq.org/4-3:zmq-setsockopt
关于python-3.x - ZeroMQ永久拉线 socket ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59887527/