在C/C++類似的語言中,明確地關閉zeromq套接字是必須的,據我瞭解。但是在一些更高級的語言中,比如php和python,它們有垃圾回收機制,我是否需要明確關閉套接字?我應該在Python中顯式關閉zeromq套接字嗎?
在php中,沒有ZMQSocket :: close()和python,pyzmq的doc說socket.close()可以省略,因爲它會在垃圾回收時自動關閉。
所以我的問題是,我需要手動關閉它嗎?...
在C/C++類似的語言中,明確地關閉zeromq套接字是必須的,據我瞭解。但是在一些更高級的語言中,比如php和python,它們有垃圾回收機制,我是否需要明確關閉套接字?我應該在Python中顯式關閉zeromq套接字嗎?
在php中,沒有ZMQSocket :: close()和python,pyzmq的doc說socket.close()可以省略,因爲它會在垃圾回收時自動關閉。
所以我的問題是,我需要手動關閉它嗎?...
當你完成它們時關閉任何I/O資源總是正確的。垃圾收集器將最終關閉它們。一旦最後一個參考值超出範圍,它可能立即關閉它。它可能會在您的程序退出時關閉它。當你等待它的時候,資源保持打開佔用內存,消耗文件指針,並且一般耗盡你的系統資源。對於一個短暫的短期計劃來說,這可能不是一個大問題,但是如果你的軟件長期存在或者建立了很多連接,這會回來傷害你。
答案是:這取決於。如果您的系統依賴於套接字關閉,那麼您更安全地關閉它們。如果你對套接字在未來不確定的時候關閉了很好,你可以通過讓垃圾回收器處理它來節省一點編碼時間並簡化你的程序。
你不需要。您可能會在以下情況下明確地關閉或刪除Python中的內容:
一般來說,即使在Python中考慮這樣的事情也是迂腐和過早的。
關閉您使用的資源被認爲是一種很好的風格。
正常情況下,垃圾收集過程中會關閉所有東西。但是這是一個實現細節,當調用__del__()
時。在CPython中,您有引用計數,並且一旦不再使用對象就會被丟棄。 Jython等其他實現可能會有所不同。
允許實現推遲垃圾收集或完全忽略垃圾收集 - 只要沒有收集到仍然可以訪問的對象,實施質量如何實現垃圾收集是一個問題。
在2.5或2.6中,引入了上下文管理器來處理這類問題。從那時起,它被認爲是GOOT風格以這種方式處理文件:
with open(...) as f:
# do stuff with file object f
# now it is automatically closed.
我不知道zeromq,但它可能是有上下文管理者的支持。
我個人很sl if,如果我通過命令行工作,但在整個程序中往往是相當嚴格的。明示比隱含更好。
當前文檔狀態,關閉套接字(或調用Context.term()
是沒有必要的
然而,pyzmq changelog states,自從版本。 14.3.0它是不是真的如在Python 3.4的變化不允許做這樣的事理智。
我已經提交了問題Update docstrings about context.term()
and socket.close()
with regards to garbage collection這一點。
我有趣的是我正面臨着你上面提到的第二個塞納里奧。在守護進程中,我將打開一個zmq套接字並保存該引用,直到進程停止,例如,收到SIGTERM。那時候,我應該明確調用socket.close()還是讓gc做這個工作? –
@Jerry:在這種情況下,讓這個過程終止。操作系統將釋放資源。 ZMQ將解決什麼是問題。此外,GC在這種情況下通常會嘗試儘可能多地進行清理。 –