欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-17 22:50:54
比如批量群发邮件的功能因为发送邮件是个比较耗时的操作,如果是传统的一个个执行 , 总体耗时比较长可以使用golang实现一个协程池 , 并行发送邮件pool包下的pool.go文件package po...

比如批量群发邮件的功能

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

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

可以使用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 , 效果

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

到此这篇关于golang协程池模拟实现群发邮件功能的文章就介绍到这了,更多相关golang协程池群发邮件内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!