golang workpool,工作池,執行緒池

xie1xiao1jun發表於2019-10-27


## [gowp](https://github.com/xxjwxc/gowp)

## golang worker pool ,執行緒池 , 工作池

- 併發限制goroutine池。
- 限制任務執行的併發性,而不是排隊的任務數。
- 無論排隊多少任務,都不會阻止提交任務。
- 通過佇列支援

- golang 工作池公共庫

### 支援最大任務數, 放到工作池裡面 並等待全部完成
```
package main

import (
"fmt"
"time"

"github.com/xxjwxc/gowp/workerpool"
)

func main() {
wp := workerpool.New(10) //設定最大執行緒數
for i := 0; i < 20; i++ { //開啟20個請求
ii := i
wp.Do(func() error {
for j := 0; j < 10; j++ { //每次列印0-10的值
fmt.Println(fmt.Sprintf("%v->\t%v", ii, j))
time.Sleep(1 * time.Second)
}
//time.Sleep(1 * time.Second)
return nil
})
}

wp.Wait()
fmt.Println("down")
}
```

### 支援錯誤返回
```
package main

import (
"fmt"
"time"

"github.com/xxjwxc/gowp/workerpool"
)

func main() {
wp := workerpool.New(10) //設定最大執行緒數
for i := 0; i < 20; i++ { //開啟20個請求
ii := i
wp.Do(func() error {
for j := 0; j < 10; j++ { //每次列印0-10的值
fmt.Println(fmt.Sprintf("%v->\t%v", ii, j))
if ii == 1 {
return errors.Cause(errors.New("my test err")) //有err 立即返回
}
time.Sleep(1 * time.Second)
}

return nil
})
}

err := wp.Wait()
if err != nil {
fmt.Println(err)
}
fmt.Println("down")
}
```

### 支援判斷是否完成 (非阻塞)

```
package main

import (
"fmt"
"time"

"github.com/xxjwxc/gowp/workerpool"
)

func main() {
wp := workerpool.New(5) //設定最大執行緒數
for i := 0; i < 10; i++ { //開啟20個請求
// ii := i
wp.Do(func() error {
for j := 0; j < 5; j++ { //每次列印0-10的值
//fmt.Println(fmt.Sprintf("%v->\t%v", ii, j))
time.Sleep(1 * time.Second)
}
return nil
})

fmt.Println(wp.IsDone())
}
wp.Wait()
fmt.Println(wp.IsDone())
fmt.Println("down")
}
```

### 支援同步等待結果

```
package main

import (
"fmt"
"time"

"github.com/xxjwxc/gowp/workerpool"
)

func main() {
wp := workerpool.New(5) //設定最大執行緒數
for i := 0; i < 10; i++ { //開啟20個請求
ii := i
wp.DoWait(func() error {
for j := 0; j < 5; j++ { //每次列印0-10的值
fmt.Println(fmt.Sprintf("%v->\t%v", ii, j))
// if ii == 1 {
// return errors.New("my test err")
// }
time.Sleep(1 * time.Second)
}

return nil
//time.Sleep(1 * time.Second)
//return errors.New("my test err")
})
}

err := wp.Wait()
if err != nil {
fmt.Println(err)
}
fmt.Println("down")
}
```

程式碼地址:[gowp](https://github.com/xxjwxc/gowp)
[喜歡請給星](https://github.com/xxjwxc/gowp)

相關文章