Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正在从zmq.error.ZMQError中恢复:地址已在使用中_Python_Sockets_Unix_Zeromq_Amqp - Fatal编程技术网

Python 正在从zmq.error.ZMQError中恢复:地址已在使用中

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: 退出程序时,关闭套接字,然后

我在运行与ZMQ的
模式(非阻塞客户端服务器)连接时按下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)