2013-08-21 36 views
1

這實際上可能涉及客戶的一般情況,使用Bootstrap - 顯然這個組是所有客戶需要的。爲什麼通過LocalChannel連接的客戶端需要EventLoopGroup?

但是,如果你有多個客戶端運行在一個JVM上,你真的吃掉了很多內存,爲每個客戶端創建一個EventLoopGroup,並且可以很容易地自己做OOM。

我能夠通過在JVM中的所有客戶端之間共享全局EventLoopGroup來解決此問題,並使用引用計數來確保其乾淨地被插入並銷燬,但這看起來更像是一種比預期設計更好的解決方法。

而且似乎沒有任何使用單線程執行程序的實現,它可以串行執行客戶端的調用;我認識到它與Netty的異步本質有些不一致,但它是一個合法的用例。

回答

5

EventLoopGroup旨在被多個客戶端信道之間共享。您無需爲每個創建的頻道創建一個新的EventLoopGroup

我不知道爲什麼你必須引入EventLoopGroup生命週期的引用計數,但是當你的應用程序即將自行終止時,你可以關閉它。或者,您可以指定一個創建守護程序線程的ThreadFactory,然後JVM將終止而不會等待由EventLoopGroup創建的線程。 Netty實際上提供了​​,這對創建一個守護線程很方便。

爲了EventLoopGroup單線程的,只是指定1作爲構造函數的參數。

+0

我去引用計數的方法,因爲在第一次每個客戶端是創造自己的EventLoopGroup,並且這是產卵很多客戶打一個遠程服務器負載測試,吃掉了一噸的內存,即使在單線程的。我可以將一個全局事件組注入到客戶端,並讓它以這種方式重新使用,但參考計數是一種更簡單的方法。 – Michael

+0

有關您的用例對Netty方面有何改進的建議? – trustin

+0

如果組是可選的,那會很好。至少對於我來說,客戶端的線程池太重了,我只是需要一種解決方法來加載測試。或者,如果有一種簡單的方法來指定某種類型的CalllerRuns組,類似於ThreadPoolExecutor.CallerRunsPolicy,這可以正常工作。客戶已經在他們自己的線程中。最後,如果有一種簡單的方法來創建一個包裝現有ExecutorService的組,那麼我可以單獨管理,這將是有用的(授予類似於我現在所做的) – Michael

相關問題