python-3.x - ZeroMQ永久拉线 socket

标签 python-3.x sockets zeromq distributed-system pyzmq

我一直在应用程序中使用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/

相关文章:

python - python中tkinter输入框中的条件

c# - 如何检查 TcpClient 连接是否关闭?

ZeroMQ PUB/SUB - 为什么多个订阅者不起作用?

c# - C# 是否支持 ZeroMQ 中的 ZMQ_ROUTER_RAW?

python - Matplotlib 保存文件为 JPEG 编码器错误

Python 3.5 Asyncio 和多​​个 websocket 服务器

python - 我如何从包含分页的网站中提取链接?(使用 Selenium )

php - 页面发布登录因等待 PHP 中的监听套接字而被阻止

java - 使用套接字和线程时出现 EOFException/SocketException

java - zeromq 与 Python 与 Java 的 node.js 性能