Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/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中显式关闭zeromq套接字吗?_Python_Zeromq - Fatal编程技术网

我应该在python中显式关闭zeromq套接字吗?

我应该在python中显式关闭zeromq套接字吗?,python,zeromq,Python,Zeromq,在类似C/C++的语言中,必须显式关闭zeromq套接字,我理解这一点。但是在一些更高级的语言中,比如php和python,它们有垃圾收集机制,我需要显式地关闭套接字吗 在php中没有ZMQSocket::close(),而在python中,pyzmq的文档说socket.close()可以省略,因为它将在垃圾收集期间自动关闭 所以我的问题是,我是否需要手动关闭它。在以下情况下,可以在Python中显式关闭或删除内容: 订购变得很重要,例如要求在继续之前关闭连接 对对象的引用将持续很长时间,一

在类似C/C++的语言中,必须显式关闭zeromq套接字,我理解这一点。但是在一些更高级的语言中,比如php和python,它们有垃圾收集机制,我需要显式地关闭套接字吗

在php中没有ZMQSocket::close(),而在python中,pyzmq的文档说socket.close()可以省略,因为它将在垃圾收集期间自动关闭


所以我的问题是,我是否需要手动关闭它。在以下情况下,可以在Python中显式关闭或删除内容:

  • 订购变得很重要,例如要求在继续之前关闭连接
  • 对对象的引用将持续很长时间,一段时间后不再需要该资源。如果将它们存储在列表中或作为成员变量,则可能会发生这种情况。您应该显式关闭资源,或者在完成后删除对它的引用

一般来说,在Python中考虑这些事情都是迂腐和过早的。

关闭您使用的资源被认为是一种很好的方式

通常情况下,在垃圾收集过程中东西是关闭的。但在调用时,这是一个实现细节。在CPython中,您可以进行引用计数,对象一旦不再使用就会被丢弃。Jython等其他实现可能会有不同的工作方式

一个实现可以推迟垃圾收集或完全忽略垃圾收集——只要没有收集到仍然可以访问的对象,垃圾收集是如何实现的是实现质量的问题

在2.5或2.6中,引入了上下文管理器,以便准确地处理此类问题。从那时起,以这种方式处理文件被认为是愚蠢的风格:

with open(...) as f:
    # do stuff with file object f
# now it is automatically closed.
我不知道zeromq,但它可能也支持上下文管理器


我个人是草率的,如果我通过命令行一行地工作,但在完整的程序中往往是相当严格的。显式比隐式好。

使用完任何I/O资源后,关闭它们总是正确的。垃圾收集器最终会将它们关闭。一旦最后一个引用超出范围,它可能会立即关闭它。它可能会在程序退出时关闭它。当您等待它这样做时,资源保持打开状态,占用内存,消耗文件指针,并且通常会占用您的系统资源。对于一个短命的小程序来说,这可能不是一个大问题,但是如果你的软件寿命长或者建立了很多连接,这会再次伤害你

答案是:视情况而定。如果您的系统依赖于关闭套接字,那么显式关闭套接字更安全。如果您对套接字在将来某个不确定的时间关闭感到满意,那么只需让垃圾收集器处理它,您就可以节省一点编码时间并简化程序。

情况正在发生变化-关闭套接字不是自动完成的 当前文档指出,关闭套接字(或调用
Context.term()
)是不必要的,因为它是通过垃圾收集自动完成的

然而,由于Python3.4中的更改不允许明智地做这样的事情,所以从版本14.3.0开始就不是这样


我为此提出了一个问题。

有趣的是,我正在面对您上面遇到的第二个senario。在守护进程中,我将打开一个zmq套接字并保留该引用,直到进程停止,例如接收SIGTERM。此时,我是否应显式调用socket.close()还是让gc来做这项工作?@Jerry:在这种情况下,就让进程终止。资源将由操作系统释放。ZMQ将确定是什么。此外,gc通常会在这种情况下尽可能多地清理。如果您阅读对该问题的响应,ZMQ资源将在正常执行过程中得到适当清理问题是,当程序意外停止时,需要显式关闭来清理ZMQ资源,否则,下次启动程序时,您甚至无法连接到与“正在使用”相同的套接字。您需要了解如何包装套接字和上下文,以确保在程序失败期间可以正确删除zmq资源。