比如批量群发邮件的功能

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

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

可以使用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协程池群发邮件内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!