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

2024-05-15 01:58:44 发布

您现在位置:Python中文网/ 问答频道 /正文

<>在C/C++语言中,必须明确地关闭ZrOMQ套接字。但是在一些高级语言中,比如php和python,它们有垃圾收集机制,我需要显式地关闭套接字吗?

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

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


Tags: 文档语言closesocket手动pyzmq机制垃圾
3条回答

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

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

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

通常情况下,在垃圾收集期间会关闭。但它是调用^{}时的实现细节。在CPython中,有引用计数,对象一旦不再使用就会被丢弃。Jython等其他实现的工作方式可能不同。

An implementation is allowed to postpone garbage collection or omit it altogether – it is a matter of implementation quality how garbage collection is implemented, as long as no objects are collected that are still reachable.

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

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

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

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

情况正在改变-关闭插座不是自动完成的

当前的文档状态是,关闭套接字(或调用Context.term())是不必要的,因为它是通过垃圾收集自动完成的。

然而,pyzmq changelog states,自从版本14.3.0以来,这不是真的,因为Python 3.4中的更改不允许明智地执行此类操作。

我已经为此提交了一个问题Update docstrings about ^{} and ^{} with regards to garbage collection

相关问题 更多 >

    热门问题