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!

推薦閱讀: