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

时间:2012-01-26 14:47:24

标签: python zeromq

在类似C / C ++的语言中,显式关闭zeromq套接字是必须的,我理解。但是在一些更高级别的语言中,例如php和python,它们都有垃圾收集机制,我是否需要明确关闭套接字?

在php中,没有ZMQSocket :: close(),在python中,pyzmq的doc说socket.close()可以省略,因为它会在垃圾收集过程中自动关闭。

所以我的问题是,我是否需要手动关闭它?...

4 个答案:

答案 0 :(得分:3)

Things are changing - closing sockets not done automatically

Current documentation states, closing sockets (or calling Context.term() is not necessary as it is done automatically with garbage collection.

However, pyzmq changelog states, that since version 14.3.0 it is not true as changes in Python 3.4 does not allow to do such thing sensibly.

I have filed an issue Update docstrings about context.term() and socket.close() with regards to garbage collection for this.

答案 1 :(得分:2)

完成后,关闭所有I / O资源始终是正确的。垃圾收集器最终将关闭它们。一旦最后一个引用超出范围,它可能会立即关闭它。当程序退出时,它可能会关闭它。在您等待它的同时,资源仍然处于打开状态,占用内存,消耗文件指针,并且通常会占用系统资源。对于一个小的,短暂的程序,这可能不是一个大问题,但如果你的软件存在很长时间或建立了很多连接,这将会伤害你。

答案是:这取决于。如果您的系统依赖于套接字关闭,那么您可以更安全地关闭它们。如果您在未来某个不确定的时间内关闭套接字就可以了,那么只需让垃圾收集器处理它就可以节省一些编码时间并简化程序。

答案 2 :(得分:1)

你没有。您可以在以下情况下在Python中显式关闭或删除内容:

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

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

答案 3 :(得分:1)

关闭您使用的资源被认为是一种很好的风格。

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

  

允许实现推迟垃圾收集或完全省略它 - 实现垃圾收集的实现质量问题,只要没有收集到仍然可以访问的对象。

在2.5或2.6中,引入了上下文管理器以便完全解决这类问题。从那时起,以这种方式处理文件被认为是goot风格:

with open(...) as f:
    # do stuff with file object f
# now it is automatically closed.

我不知道zeromq,但它可能也支持上下文管理器。

如果我通过命令行工作,我个人很邋,但在完整的程序中往往相当严格。最好是明确而不是隐含。