• [Go] 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
    ",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!
    ",page)
            page++
        }
    }
    func TestPool(t *testing.T) {
        //定义5个协程
        pool.Nums = 5
        //开个子协程去不停的获取邮箱
        go GetEmails()
        //执行
        pool.Run()
    }

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

    开源作品

    GO-FLY,一套可私有化部署的免费开源客服系统,安装过程不超过五分钟(超过你打我 !),基于Golang开发,二进制文件可直接使用无需搭开发环境,下载zip解压即可,仅依赖MySQL数据库,是一个开箱即用的网页在线客服系统,致力于帮助广大开发者/中小站长快速整合私有客服功能
    github地址:go-fly
    官网地址:https://gofly.sopans.com

    赞赏作者

    微信交流

  • 相关阅读:
    06-ajax发送请求-上传时注意事项
    02-git hooks是什么玩意?跟husky什么关系?
    SpringBoot配置热部署
    稀疏数组
    移动web开发——flex布局
    网站推荐
    ArrayList中的contains方法
    Java对象相等判断
    逻辑与(&)、短路与(&&)、逻辑或(|)、短路或(||)
    CentOS6.5下设置静态IP
  • 原文地址:https://www.cnblogs.com/taoshihan/p/14722053.html
Copyright © 2020-2023  润新知