Python 正在从zmq.error.ZMQError中恢复:地址已在使用中
我在运行与ZMQ的Python 正在从zmq.error.ZMQError中恢复:地址已在使用中,python,sockets,unix,zeromq,amqp,Python,Sockets,Unix,Zeromq,Amqp,我在运行与ZMQ的对模式(非阻塞客户端服务器)连接时按下Ctrl-C键。后来,当我尝试运行REQ-REP(阻塞客户机单服务器连接)模式时,我不断得到已在使用的地址错误。我曾尝试使用netstat-ltnp | grep:运行netstat,但没有列出任何进程 那么到底是谁在使用这个地址呢 还有,如何优雅地关闭这些套接字连接?问题1: 如果在Linux类型的操作系统上执行sudo netstat-ltnp,则很可能会看到拥有该端口的进程。用Kill-9杀死它 问题2: 退出程序时,关闭套接字,然后
对模式(非阻塞客户端服务器)连接时按下Ctrl-C键。后来,当我尝试运行REQ-REP
(阻塞客户机单服务器连接)模式时,我不断得到已在使用的地址
错误。我曾尝试使用netstat-ltnp | grep:
运行netstat,但没有列出任何进程
那么到底是谁在使用这个地址呢
还有,如何优雅地关闭这些套接字连接?问题1:
如果在Linux类型的操作系统上执行sudo netstat-ltnp,则很可能会看到拥有该端口的进程。用Kill-9
杀死它
问题2:
退出程序时,关闭套接字,然后调用zmq_ctx_destroy()。这破坏了上下文。有关更多信息,请参阅。此时此刻:
下一步:
开始使用尝试:
/除了:
/最后:
封装构造函数,它将帮助您从所有zmq分配(包括所有Socket-s'.close()
和Context的.term()
中优雅地退出,而不会出现任何悬空的孤立内存泄漏,即使任何紧急按钮或未处理的异常会完全中断您的代码执行,并丢失对仍然挂起的、网络硬件绑定的实例的引用。有时另一个zeromq使用进程正在使用端口,而netstat
并不表示其他进程正在侦听(因此,netstat-lntp
不会显示它),而是显示端口上已建立的连接,两端具有相同的主机/端口。在终止另一个进程后,该端口现在可供使用
原因#1:之所以发生这种情况,是因为我在临时端口范围内设置了zeromq侦听端口(在linux上,例如32768-61000)它被用作传出连接的本地端,我的服务需要连接到同一个框中的其他服务。传出连接获得与该框中侦听端口相同的临时端口的时间百分比,突然出现“地址已在使用中”.我只是将所有侦听端口移到了临时端口范围之外,所有“地址已在使用”问题都消失了
原因#2:推测:当我在其他python网络库中遇到类似问题时,有问题的进程以前是使用子进程或类似程序从侦听进程启动的,套接字泄漏到子进程时出现问题;如果父进程退出而不关闭套接字,则套接字将被删除保持活动状态并归子进程所有,即使子进程对套接字一无所知,它仍然会被挂起,因此其他进程无法使用它
如果这是问题所在,则可以通过在子进程之前调整套接字的标志来解决,例如(特定于unix):
或者有一种方法可以更正确地关闭父进程中的套接字。发布一些代码说明用法。您遇到了什么问题?已经过几天了,我已经解决了这个问题,但我认为netstat-ltnp
需要额外的参数-这些参数给了我帮助消息。我还可以作为netstat-ltn运行它p tcp
,它列出了所有tcp连接,但没有显示PID。Mac OS X上的netstat
可能与其他操作系统上的不同。我已用信息更新了答案,该答案仅适用于linux。很抱歉,我不知道Mac OS X,因此我无法在Mac OS上给出正确答案,但经过quick search我知道这个命令非常不同。对于其他使用Mac的用户,可以使用这个sudo lsof-iTCP-sTCP:LISTEN-n-P
来查看PID。谢谢。但是我必须执行ctrl+c(ctrl+z不起作用)。它是.term()。不是.term()
reboot
fd = sock.get(zmq.FD)
old_flags = fcntl.fcntl(fd, fcntl.F_GETFD)
fcntl.fcntl(fd, fcntl.F_SETFD, old_flags | fcntl.FD_CLOEXEC)