当前位置 博文首页 > golang协程池模拟实现群发邮件功能

    golang协程池模拟实现群发邮件功能

    作者:陶士涵 时间:2021-05-27 17:45

    比如批量群发邮件的功能

    因为发送邮件是个比较耗时的操作,

    如果是传统的一个个执行 , 总体耗时比较长

    可以使用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{
                "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个协程
        pool.Nums = 5
        //开个子协程去不停的获取邮箱
        go GetEmails()
        //执行
        pool.Run()
    }

    执行go test -v pool_test.go , 效果

    js
    下一篇:没有了