golang協(xié)程池模擬實現(xiàn)群發(fā)郵件功能
比如批量群發(fā)郵件的功能
因為發(fā)送郵件是個比較耗時的操作,
如果是傳統(tǒng)的一個個執(zhí)行 , 總體耗時比較長
可以使用golang實現(xiàn)一個協(xié)程池 , 并行發(fā)送郵件
pool包下的pool.go文件
package pool import "log" //具體任務,可以傳參可以自定義操作 type Task struct { Args interface{} Do func(interface{})error } //協(xié)程的個數(shù) var Nums int //任務通道 var JobChannels =make(chan Task) //入口的任務通道 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, } //每個郵箱任務塞入任務通道 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í)行go test -v pool_test.go , 效果
到此這篇關于golang協(xié)程池模擬實現(xiàn)群發(fā)郵件功能的文章就介紹到這了,更多相關golang協(xié)程池群發(fā)郵件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Golang中空的切片轉(zhuǎn)化成 JSON 后變?yōu)?nbsp;null 問題的解決方案
在 Golang 中,經(jīng)常需要將其他類型(例如 slice、map、struct 等類型)的數(shù)據(jù)轉(zhuǎn)化為 JSON 格式,有時候轉(zhuǎn)化的結果并不是預期中的,例如將一個空的切片轉(zhuǎn)化為 JSON 時,會變成"null",所以本文將給大家介紹一下解決方法,需要的朋友可以參考下2023-09-09Go?實現(xiàn)?WebSockets和什么是?WebSockets
這篇文章主要介紹了Go?實現(xiàn)?WebSockets和什么是?WebSockets,WebSockets?是構建實時應用程序的第一大解決方案,在線游戲、即時通訊、跟蹤應用程序等,下文相關內(nèi)容介紹需要的小伙伴可以參考一下2022-04-04Go語言反射reflect.Value實現(xiàn)方法的調(diào)用
本文主要介紹了Go語言反射reflect.Value實現(xiàn)方法的調(diào)用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05