golang協(xié)程池模擬實(shí)現(xiàn)群發(fā)郵件功能
比如批量群發(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;i<Nums;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 //開(kāi)個(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ì)詳解
- GO實(shí)現(xiàn)協(xié)程池管理的方法
- Golang協(xié)程池gopool設(shè)計(jì)與實(shí)現(xiàn)
- Go簡(jiǎn)單實(shí)現(xiàn)協(xié)程池的實(shí)現(xiàn)示例
- Golang協(xié)程池的實(shí)現(xiàn)與應(yīng)用
- Go高級(jí)特性探究之協(xié)程池詳解
- 詳解Go語(yǔ)言如何實(shí)現(xiàn)一個(gè)最簡(jiǎn)化的協(xié)程池
- Golang線(xiàn)程池與協(xié)程池的使用
- golang實(shí)現(xiàn)協(xié)程池的方法示例
- go協(xié)程池實(shí)現(xiàn)原理小結(jié)
相關(guān)文章
大多數(shù)Go程序員都走過(guò)的坑盤(pán)點(diǎn)解析
這篇文章主要為大家介紹了大多數(shù)Go程序員都走過(guò)的坑盤(pán)點(diǎn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Golang中空的切片轉(zhuǎn)化成 JSON 后變?yōu)?nbsp;null 問(wèn)題的解決方案
在 Golang 中,經(jīng)常需要將其他類(lèi)型(例如 slice、map、struct 等類(lèi)型)的數(shù)據(jù)轉(zhuǎn)化為 JSON 格式,有時(shí)候轉(zhuǎn)化的結(jié)果并不是預(yù)期中的,例如將一個(gè)空的切片轉(zhuǎn)化為 JSON 時(shí),會(huì)變成"null",所以本文將給大家介紹一下解決方法,需要的朋友可以參考下2023-09-09Go?實(shí)現(xiàn)?WebSockets和什么是?WebSockets
這篇文章主要介紹了Go?實(shí)現(xiàn)?WebSockets和什么是?WebSockets,WebSockets?是構(gòu)建實(shí)時(shí)應(yīng)用程序的第一大解決方案,在線(xiàn)游戲、即時(shí)通訊、跟蹤應(yīng)用程序等,下文相關(guān)內(nèi)容介紹需要的小伙伴可以參考一下2022-04-04使用Go語(yǔ)言開(kāi)發(fā)短鏈接服務(wù)的方法
短鏈接一般是通過(guò)映射關(guān)系,將長(zhǎng)長(zhǎng)的一串網(wǎng)址,映射到幾個(gè)字符的短鏈接上,建立好這種映射關(guān)系之后保存到數(shù)據(jù)庫(kù)里,用戶(hù)每次訪(fǎng)問(wèn)短鏈接的時(shí)候,這篇文章主要介紹了使用Go語(yǔ)言開(kāi)發(fā)一個(gè)短鏈接服務(wù),需要的朋友可以參考下2024-03-03Go語(yǔ)言進(jìn)行多時(shí)區(qū)時(shí)間轉(zhuǎn)換的示例代碼
本文介紹了使用Go語(yǔ)言進(jìn)行多時(shí)區(qū)時(shí)間轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-12-12Go語(yǔ)言反射reflect.Value實(shí)現(xiàn)方法的調(diào)用
本文主要介紹了Go語(yǔ)言反射reflect.Value實(shí)現(xiàn)方法的調(diào)用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05使用go語(yǔ)言解析xml的實(shí)現(xiàn)方法(必看篇)
下面小編就為大家?guī)?lái)一篇使用go語(yǔ)言解析xml的實(shí)現(xiàn)方法(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06