golang協程池模擬實現群發郵件功能
比如批量群發郵件的功能
因為發送郵件是個比較耗時的操作,
如果是傳統的一個個執行 , 總體耗時比較長
可以使用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;i<Nums;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{ "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", } 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協程池群發郵件內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!