我应该在Python中显式关闭zeromq套接字吗?
在像C/C++这样的语言中,明确关闭zeromq的套接字是非常重要的,我明白这一点。但是在一些高级语言中,比如php和python,它们有垃圾回收机制,我还需要手动关闭套接字吗?
在php中,没有ZMQSocket::close()这个方法,而在python中,pyzmq的文档说socket.close()可以省略,因为在垃圾回收时会自动关闭。
所以我的问题是,我需要手动关闭它吗?...
4 个回答
使用完资源后及时关闭它们被认为是一种好习惯。
通常情况下,资源会在垃圾回收时被关闭。但具体什么时候调用__del__()
这个方法是实现细节。在CPython中,使用引用计数的方式,一旦对象不再被使用,它就会被立即丢弃。而其他实现,比如Jython等,可能会有不同的处理方式。
一个实现可以推迟垃圾回收,甚至完全不进行垃圾回收——这取决于实现的质量,只要没有仍然可以访问的对象被回收就可以。
在2.5或2.6版本中,引入了上下文管理器来解决这类问题。从那时起,用这种方式处理文件被认为是好习惯:
with open(...) as f:
# do stuff with file object f
# now it is automatically closed.
我对zeromq不太了解,但它可能也支持上下文管理器。
我个人在命令行上写一行代码时比较随意,但在写完整程序时会比较严格。明确地写出代码总是比模糊地写要好。
事情在变化 - 关闭套接字不再自动完成
现在的文档说,关闭套接字(或者调用 Context.term()
)是不必要的,因为这个过程会在垃圾回收时自动完成。
但是,pyzmq 的更新记录指出,自从版本 14.3.0 以来,这个说法就不成立了,因为 Python 3.4 的一些变化使得这个操作无法再像以前那样合理地自动完成。
我已经在这里提交了一个问题 更新文档,关于 context.term()
和 socket.close()
在垃圾回收方面的说明。
在你用完任何输入输出资源后,记得把它们关闭。这是个好习惯。虽然垃圾回收机制会最终关闭这些资源,但它的关闭时间不一定。可能在你最后一次使用这些资源后,它就会立刻关闭,也可能等到你的程序结束时才关闭。在这段等待的时间里,这些资源仍然会占用内存、消耗文件指针,并且会浪费系统资源。对于一些小程序来说,这可能不是大问题,但如果你的软件运行时间长或者连接很多,这就可能会造成麻烦。
那么,答案是:这要看情况。如果你的系统依赖于某个连接(比如socket)被关闭,那么最好还是手动关闭它们。如果你不在乎这个连接什么时候被关闭,可以省点时间,让垃圾回收机制来处理,这样你的代码会简单一些。