如何優雅的控制goroutine的數量

2022-09-09 04:06:07 字數 1488 閱讀 1813

1,為什麼要控制goroutine的數量?

goroutine固然好,但是數量太多了,往往會帶來很多麻煩,比如耗盡系統資源導致程式崩潰,或者cpu使用率過高導致系統忙不過來。比如:

1

for i:=0; i < 10000; i++

2,用什麼方法控制goroutine的數量?

要在每一次執行go之前判斷goroutine的數量,如果數量超了,就要阻塞go的執行。第一時間想到的就是使用通道。每次執行的go之前向通道寫入值,直到通道滿的時候就阻塞了,如下:

1

var ch chan int23

func work() 78

func main()

14 }

這樣每次同時執行的goroutine就被限制為10個了。但是新的問題出現了,因為並不是所有的goroutine都執行完了,在main函式退出之後,還有一些goroutine沒有執行完就被強制結束了。這個時候我們就需要用到sync.waitgroup。使用waitgroup等待所有的goroutine退出。如下:

1

var wg *sync.waitgroup23

func work() 78

func main()

10for i:=0; i < 10000; i++

14 wg.wait()//

等待所有goroutine退出

15 }

3,優雅的使用並控制goroutine的數量

綜上所述,我們封裝一下,**如下:

1

package gpool23

import (4"

sync"5

)67 type pool struct

1112 func new(size int) *pool

16return &pool,19}

20}2122 func (p *pool) add(delta int

) 26

for i := 0; i > delta; i--

29p.wg.add(delta)30}

3132 func (p *pool) done()

3637 func (p *pool) wait()

來段測試**:

1

package gpool_test23

import (4"

runtime"5

"testing"6

"time"7

"gpool"8

)910 func test_example(t *testing.t) ()20}

21pool.wait()

22println(runtime.numgoroutine())

23 }

good job,over~

如何優雅的控制文字顯示行數

如何簡單有效的隱藏超出長度的多行文字呢?曾經覺得只能通過指令碼輔以配置才能比較完美的解決這個問題,這兩天才發現原來webkit瀏覽器中已經有完美的解決方案了。這篇文章介紹了隱藏多行文字的幾種方式。下面介紹下webkit瀏覽器中純css的解決方案。line clamplook,就這麼簡單。webkit...

C Tip 如何優雅的控制線程狀態

先問讀者乙個問題,如果想控制乙個執行緒 thread 掛起,繼續,結束你會優先選擇如何處理?從面試的經驗來看,多數的面試者都會說thread不是提供了suspend,resume,abort等方法嗎,直接呼叫就好了,簡單快捷.但很多情況下簡單就是美只是乙個謊言而已.suspend和resume方法已...

如何優雅的送禮?

送禮的尺度要以法律規定和公司制度為紅線,在職場上,肯定不能送重禮,否則可能成為商業賄賂。很多國際化的公司都有明確的送禮和收禮規定,不能超過幾百元。牢記這一條,你就會發現有創意是多麼的重要,因為你的預算空間實在很小。送禮這件事,從策劃選禮物到對方接收到禮物是乙個操作過程,最重要的是送禮時刻。其實對於有...