比如批量群發郵件的功能
因為發送郵件是個比較耗時的操作,
如果是傳統的一個個執行 , 總體耗時比較長
可以使用golang實現一個協程池 , 并行發送郵件
pool包下的pool.go文件
package pool
import "log"
//具體任務,可以傳參可以自定義操作
type Task struct {
Args interface{}
Do func(interface{})error
}
//協程的個數
var Nums int
//任務通道
var JobChannels =make(chan Task)
//入口的任務通道
var Jobs =make(chan Task)
//執行
func Run(){
for i:=0;iNums;i++{
go worker(i)
}
for task:=range Jobs{
JobChannels-task
}
close(JobChannels)
}
//實際的工作協程worker
func worker(workId int){
for task:=range JobChannels{
ret:=task.Do(task.Args)
log.Printf("worker_id:%d , worker_ret:%v\n",workId,ret)
}
}
具體的使用
test包下的pool_test.go測試文件
package test
import (
"errors"
"gofly/pool"
"log"
"testing"
"time"
)
//真正的模擬發送郵件
func SendEmail(email interface{})error{
log.Println(email," start..")
//模擬耗時
time.Sleep(time.Second*10)
return errors.New(email.(string)+" end..")
}
//獲取郵箱并發送
func GetEmails(){
//如果數據量比較大分頁獲取
page:=1;
for{
//模擬每頁獲取的郵箱
emails:=[]string{
"1@qq.com",
"2@qq.com",
"3@qq.com",
"4@qq.com",
"5@qq.com",
"6@qq.com",
"7@qq.com",
}
for _,email:=range emails{
var sendEmailTask=pool.Task{
Args: email,
Do: SendEmail,
}
//每個郵箱任務塞入任務通道
pool.Jobs - sendEmailTask
}
log.Printf("page %d done!\n",page)
page++
}
}
func TestPool(t *testing.T) {
//定義5個協程
pool.Nums = 5
//開個子協程去不停的獲取郵箱
go GetEmails()
//執行
pool.Run()
}
執行go test -v pool_test.go , 效果

到此這篇關于golang協程池模擬實現群發郵件功能的文章就介紹到這了,更多相關golang協程池群發郵件內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- golang協程池設計詳解
- golang 40行代碼實現通用協程池
- GO實現協程池管理的方法