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

到此這篇關(guān)于golang協(xié)程池模擬實現(xiàn)群發(fā)郵件功能的文章就介紹到這了,更多相關(guān)golang協(xié)程池群發(fā)郵件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang中空的切片轉(zhuǎn)化成 JSON 后變?yōu)?nbsp;null 問題的解決方案
在 Golang 中,經(jīng)常需要將其他類型(例如 slice、map、struct 等類型)的數(shù)據(jù)轉(zhuǎn)化為 JSON 格式,有時候轉(zhuǎn)化的結(jié)果并不是預(yù)期中的,例如將一個空的切片轉(zhuǎn)化為 JSON 時,會變成"null",所以本文將給大家介紹一下解決方法,需要的朋友可以參考下2023-09-09
Go?實現(xiàn)?WebSockets和什么是?WebSockets
這篇文章主要介紹了Go?實現(xiàn)?WebSockets和什么是?WebSockets,WebSockets?是構(gòu)建實時應(yīng)用程序的第一大解決方案,在線游戲、即時通訊、跟蹤應(yīng)用程序等,下文相關(guān)內(nèi)容介紹需要的小伙伴可以參考一下2022-04-04
Go語言進(jìn)行多時區(qū)時間轉(zhuǎn)換的示例代碼
本文介紹了使用Go語言進(jìn)行多時區(qū)時間轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-12-12
Go語言反射reflect.Value實現(xiàn)方法的調(diào)用
本文主要介紹了Go語言反射reflect.Value實現(xiàn)方法的調(diào)用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05

