比如批量群發(fā)郵件的功能
因?yàn)榘l(fā)送郵件是個(gè)比較耗時(shí)的操作,
如果是傳統(tǒng)的一個(gè)個(gè)執(zhí)行 , 總體耗時(shí)比較長(zhǎng)
可以使用golang實(shí)現(xiàn)一個(gè)協(xié)程池 , 并行發(fā)送郵件
pool包下的pool.go文件
package pool
import "log"
//具體任務(wù),可以傳參可以自定義操作
type Task struct {
Args interface{}
Do func(interface{})error
}
//協(xié)程的個(gè)數(shù)
var Nums int
//任務(wù)通道
var JobChannels =make(chan Task)
//入口的任務(wù)通道
var Jobs =make(chan Task)
//執(zhí)行
func Run(){
for i:=0;iNums;i++{
go worker(i)
}
for task:=range Jobs{
JobChannels-task
}
close(JobChannels)
}
//實(shí)際的工作協(xié)程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測(cè)試文件
package test
import (
"errors"
"gofly/pool"
"log"
"testing"
"time"
)
//真正的模擬發(fā)送郵件
func SendEmail(email interface{})error{
log.Println(email," start..")
//模擬耗時(shí)
time.Sleep(time.Second*10)
return errors.New(email.(string)+" end..")
}
//獲取郵箱并發(fā)送
func GetEmails(){
//如果數(shù)據(jù)量比較大分頁(yè)獲取
page:=1;
for{
//模擬每頁(yè)獲取的郵箱
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,
}
//每個(gè)郵箱任務(wù)塞入任務(wù)通道
pool.Jobs - sendEmailTask
}
log.Printf("page %d done!\n",page)
page++
}
}
func TestPool(t *testing.T) {
//定義5個(gè)協(xié)程
pool.Nums = 5
//開個(gè)子協(xié)程去不停的獲取郵箱
go GetEmails()
//執(zhí)行
pool.Run()
}
執(zhí)行g(shù)o test -v pool_test.go , 效果
到此這篇關(guān)于golang協(xié)程池模擬實(shí)現(xiàn)群發(fā)郵件功能的文章就介紹到這了,更多相關(guān)golang協(xié)程池群發(fā)郵件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- golang協(xié)程池設(shè)計(jì)詳解
- golang 40行代碼實(shí)現(xiàn)通用協(xié)程池
- GO實(shí)現(xiàn)協(xié)程池管理的方法