golang併發數量及超時控制

qianlnk · · 3164 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

這裡介紹一個控制golang併發數量的包gowork,當然都是可以自己實現的,只是每次去實現比較麻煩罷了。
 
如果只是啟一個goroutine那就沒有必要使用,當然這個包也是支持的。
 
實現原理:
用戶告知要啟用的併發數量,然後包內會啟動相當於併發數量的一個工作池。這樣之後程序猿只要往工作池裡面發任務就可以了。
 
當然你需要的是實現你的worker。原型:
type WorkFunction func(req interface{}, res interface{})
還可以實現異常處理的函數,原型和worker一樣,同時在使用的時候gowork會自動將任務參數req對應的傳給異常處理函數,你需要做的是通過req獲取異常處理結果,當然你也可以不要這些結果。
 
使用:
控制同時併發數量為5,new一個WorkManager來管理goroutine,通過NewGoroutine啟動worker池,然後就可以AddRequest發布任務去執行了。
 
package main

import (
    "fmt"

    "github.com/qianlnk/gowork"
)

type People struct {
    Id   int
    Name string
}

func SayHello(request, response interface{}) {
    req := request.(People)
    fmt.Printf("Hello, I'm %s, My ID is %d.\n", req.Name, req.Id)
}

func SingSong(request, response interface{}) {
    req := request.(People)
    fmt.Printf("My ID is %d, what I will sing is test_%s\n", req.Id, req.Name)
}

func main() {
    wm := gowork.NewWorkManager()
    wm.NewGoroutine("sayhello", 5, SayHello, nil)
    wm.NewGoroutine("singsong", 5, SingSong, nil)
    go func() {
        for i := 1; i < 20; i++ {
            pl := People{
                Id:   i,
                Name: fmt.Sprintf("hello%d", i),
            }
            wm.AddRequest("sayhello", pl)
        }
        wm.Done("sayhello")
    }()
    for i := 0; i < 20; i++ {
        pl := People{
            Id:   i,
            Name: fmt.Sprintf("song%d", i),
        }
        wm.AddRequest("singsong", pl)
    }
    wm.Done("singsong")
}
當然 ,如果你願意你也可以把發布任務也起成goroutine這樣調用Done的時候程序會等待任務發佈完成並全部執行結束。
 
具體使用可以移駕github:
 

有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:qianlnk

查看原文:golang併發數量及超時控制

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

3164 次点击  ∙  1 赞  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传