原文鏈接:https://studygolang.com/articles/27181
//注意 //線程池執行有兩種,一種執行普通邏輯方法pool,可接受所有方法,另一種執行形同類型的方法(就是每次接收的內容方法都一樣) //使用前需要先建立一個對應的pool對象,參數是容量大小和過期時間等, 如果使用普通方法,有默認方法可以使用 //使用后,需要調用Release來結束使用,意思就是close那類的意思 //總的來說,使用過程就是,新建對象,加入邏輯函數代碼,結束使用關閉對象。 package main import ( "fmt" "log" "sync" "time" "github.com/panjf2000/ants" ) const ( runTime = 100 ) func demosFunc() { time.Sleep(10 * time.Millisecond) fmt.Println("Hello World!") } func demoFunc() { time.Sleep(time.Duration(BenchParam) * time.Millisecond) } //antsDefaultCommon 使用默認普通pool //其實就是使用了普通的pool,為了方便直接使用,在內部已經new了一個普通的pool, //相當於下面那個新建的過程給你寫好了,容量大小和過期時間都用默認的,詳細信息可以看源碼,里面剝一層就可以看到 //例子三 func antsDefaultCommon() { var wg sync.WaitGroup //這里使用等待是為了看出結果,阻塞主線程,防止直接停止,如果在web項目中,就不需要 defer ants.Release() //退出工作,相當於使用后關閉 log.Println("start ants work") for i := 0; i < runTime; i++ { wg.Add(1) ants.Submit(func() { //提交函數,將邏輯函數提交至work中執行,這里寫入自己的邏輯 log.Println(i, ":hello") time.Sleep(time.Millisecond * 10) wg.Done() }) } wg.Wait() log.Println("stop ants work") } //antsCommon 使用普通的pool //例子一 func antsCommon() { p, _ := ants.NewPool(BenchAntsSize, ants.WithExpiryDuration(DefaultExpiredTime)) //新建一個pool對象,其他同上 defer p.Release() for j := 0; j < runTime; j++ { _ = p.Submit(func() { log.Println(":hello") time.Sleep(time.Millisecond * 10) }) } } //antsMarkFuncPut 使用特定的帶有函數內容的pool //例子二 func antsMarkFuncPut() { var wg sync.WaitGroup p, _ := ants.NewPoolWithFunc(10, func(i interface{}) { //新建一個帶有同類方法的pool對象 myFunc(i) wg.Done() }) defer p.Release() // Submit tasks one by one. for i := 0; i < runTime; i++ { wg.Add(1) _ = p.Invoke(int32(i)) //這個就是發送,相當於上述普通的pool的submit,唯一不同的是參數,因為這個發送的同類型的方法,加入邏輯代碼時注意 } wg.Wait() fmt.Printf("running goroutines: %d\n", p.Running()) fmt.Printf("finish all tasks, result is %d\n", sum) if sum != 499500 { panic("the final result is wrong!!!") } }