簡體   English   中英

ZMQ Java-退出時進行清理的最佳實踐

[英]ZMQ Java - Best practice to clean when exiting

他們建議在ZMQ zguide中始終在任務結束時進行清理。 我對最佳做法有些困惑。

第一

  • ...即使關閉所有套接字,默認情況下zmq_ctx_destroy()也會永遠等待
  • ...最后,破壞上下文
  • ...這將導致任何阻塞的接收或輪詢或發送連接的線程以錯誤返回。 捕獲該錯誤,然后繼續運行並關閉該線程中的套接字,

Q1:那么在銷毀上下文之前,我需要關閉所有套接字嗎?

Q2:那么我需要銷毀上下文嗎?

查看context.destroy()我看到它調用linger並在每個套接字上關閉。

Q3:我應該如何終止我的ZMQ資源?

如果我查看jeromq代碼,請進行編輯 -我在ZContext.destroy看到對
destroySocket (到每個套接字)

s.setLinger( linger );
s.close();
sockets.remove( s );

然后它甚至調用sockets.clear(); context.term();

Q4:夠了嗎?

A1:是的,但是...

A2:是的,但是...

A3:遵循ZeroMQ最佳實踐,不僅僅依賴於語言綁定

A4:參考號 A3

“最佳實踐”的動機是什么?

首先,應該意識到,ZeroMQ具有一組內部架構原則,任何人都不得故意或無意違反。

也就是說,可能還意識到,不同的語言綁定(不是ZeroMQ,而是與內部體系結構規則外部關聯的其他一些代碼包裝器)在編排寬限終止時可能會遇到問題(有些包裝器將其隱藏在幕后)因此用戶不知道在那里會發生什么)。

無休止地將.bind() s .bind()到localhost端口,而陷入.bind()線程只是資源釋放和終止實踐不佳可能遇到的一些麻煩。

ZeroMQ的經驗法則是什么?

  1. 在所有ZMQ-socket實例上強制執行非阻塞 .close()
  2. 最后執行.term() ZMQ上下文實例

廣告1) 非阻塞方式, 必須ZMQ_LINGER那樣適當注意 .setsockopt()參數,以避免ZMQ_LINGER ,使ZMQ-socket原型在期望對方無休止地等待中可能仍有一些消息要接收,因此在此步驟上要格外謹慎和有條理。 調用.close() 之前設置所有安全退出參數。 否則,您將失去進入阻止模式的控制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM