使用 go
關鍵字有時候須要控制一下併發的數量, 但不至於去修改 runtime.GOMAXPROCS
這個數值, 這裏就用到了緩衝channel
的特性bash
demo:併發
package pool import ( "sync" ) // WaitGroup 一個異步結構體 type WaitGroup struct { workChan chan int wg sync.WaitGroup } // NewPool 生成一個工做池, coreNum 限制 func NewPool(coreNum int) *WaitGroup { ch := make(chan int, coreNum) return &WaitGroup{ workChan: ch, wg: sync.WaitGroup{}, } } // Add 添加 func (ap *WaitGroup) Add(num int) { for i := 0; i < num; i++ { ap.workChan <- i ap.wg.Add(1) } } // Done 完結 func (ap *WaitGroup) Done() { LOOP: for { select { case <-ap.workChan: break LOOP } } ap.wg.Done() } // Wait 等待 func (ap *WaitGroup) Wait() { ap.wg.Wait() }
test:異步
package pool import ( "fmt" "testing" "time" ) func TestRun(t *testing.T) { work := NewPool(4) for i := 0; i < 50; i++ { work.Add(1) go testFunc(i, work) } fmt.Println("waiting...") work.Wait() t.Log("done") } func testFunc(i int, wg *WaitGroup) { defer wg.Done() fmt.Println(time.Now().Format("2006-01-02T15:04:05Z07:00"), "output: ", i) time.Sleep(time.Second * 1) fmt.Println(time.Now().Format("2006-01-02T15:04:05Z07:00"), "output: ", i, "done") }
輸出:code
2018-12-04T14:22:27+08:00 output: 3 2018-12-04T14:22:27+08:00 output: 1 2018-12-04T14:22:27+08:00 output: 0 2018-12-04T14:22:27+08:00 output: 2 2018-12-04T14:22:28+08:00 output: 3 done 2018-12-04T14:22:28+08:00 output: 0 done 2018-12-04T14:22:28+08:00 output: 1 done 2018-12-04T14:22:28+08:00 output: 5 2018-12-04T14:22:28+08:00 output: 6 2018-12-04T14:22:28+08:00 output: 2 done 2018-12-04T14:22:28+08:00 output: 7 2018-12-04T14:22:28+08:00 output: 4 2018-12-04T14:22:29+08:00 output: 4 done 2018-12-04T14:22:29+08:00 output: 8 2018-12-04T14:22:29+08:00 output: 7 done 2018-12-04T14:22:29+08:00 output: 6 done .....
這裏仍是要帶上 sync.WaitGroup
, 保證最後一次循環時攜程不會過早退出orm