天天看點

分析一個簡單的goroutine資源池

分析一個簡單的goroutine資源池 tunny。

從資源池中擷取goroutine并進行處理的邏輯如下:

分析一個簡單的goroutine資源池

tunny将goroutine處理單元封裝為<code>workWrapper</code>,由此可以對goroutine的數目進行限制。

workerWrapper.run()作為一個goroutine,内部負責具體事務的處理。其會将一個<code>workRequest</code>(可以看作是請求處理單元)放入<code>reqChan</code>,并阻塞等待使用方的調用。<code>workRequest</code>主要包含兩個channel,其中<code>jobChan</code>用于傳入調用方的輸入,<code>retChan</code>用于給調用方傳回執行結果。

調用方會從pool的reqChan中擷取一個<code>workRequest</code>請求處理單元,并在<code>workRequest.jobChan</code>中傳參,這樣workerWrapper.run()中就會繼續進行<code>work.process</code>處理。處理結束之後将結果通過<code>workRequest.retChan</code>傳回給調用方,然後繼續通過<code>reqChan &lt;- workRequest</code>阻塞等待下一個調用方的處理。

其中workerWrapper.run()中的<code>work</code>是一個需要使用者實作的接口,接口内容如下,最重要的接口是<code>Process(interface{}) interface{}</code>

tunny中的封裝和處理函數并不适合所有的場景,但可以借鑒其核心思想來構造特定場景下的goroutine資源池。