跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • golang worker pool , 工作池,线程池
未分類
19 5 月 2020

golang worker pool , 工作池,线程池

golang worker pool , 工作池,线程池

資深大佬 : xie1xiao1jun 55

gowp

golang worker pool ,线程池 , 工作池

  • 并发限制 goroutine 池。

  • 限制任务执行的并发性,而不是排队的任务数。

  • 无论排队多少任务,都不会阻止提交任务。

  • 通过队列支持

  • golang 工作池公共库

支持最大任务数, 放到工作池里面 并等待全部完成

package main  import (  "fmt"  "time"   "github.com/xxjwxc/gowp/workpool" )  func main() {  wp := workpool.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/workpool" )  func main() {  wp := workpool.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/workpool" )  func main() {  wp := workpool.New(5)              //设置最大线程数  for i := 0; i < 10; i++ { //开启 20 个请求   // ii := i   wp.Do(func() error {    for j := 0; j < 5; j++ {      //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/workpool" )  func main() {  wp := workpool.New(5)              //设置最大线程数  for i := 0; i < 10; i++ { //开启 20 个请求   ii := i   wp.DoWait(func() error {    for j := 0; j < 5; j++ {     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 喜欢请给星

大佬有話說 (6)

  • 資深大佬 : mcfog

    我选择 https://github.com/Jeffail/tunny

  • 主 資深大佬 : xie1xiao1jun

    @mcfog 功能比他更丰富,而且,技术更新。用的 sync.WaitGroup

  • 資深大佬 : whoami9894

    @xie1xiao1jun
    不是我杠啊,select+channel 和 wg 之间还有啥新旧技术之分吗

  • 主 資深大佬 : xie1xiao1jun

    @whoami9894 select+channel 模式是会阻塞的(超过最大缓冲数)。

  • 資深大佬 : mengzhuo

    @xie1xiao1jun 然后放个链表里不就好了……

  • 主 資深大佬 : xie1xiao1jun

    @mengzhuo 是的,实现非阻塞方式很多种。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具