goroutine并发MySQL_并发模式-goroutine

该博客介绍了一个名为`runner`的包,它使用goroutine和通道来管理和控制一组任务的执行,特别是在面临超时和操作系统中断时。通过创建`Runner`实例并设置超时时间,可以确保程序在指定时间内完成任务或在接收到中断信号时优雅地退出。`createTask`函数创建了一个根据ID睡眠指定秒数的任务,用于模拟工作负载。在main函数中,如果任务超时或接收到中断信号,程序会相应地记录错误信息并退出。
摘要由CSDN通过智能技术生成

1,runner

runner包用于展示如果使用通道来监视程序的执行时间,如果程序运行时间太长,也可以用runner包来终止程序。当开发需要调度后台处理的程序的时候,这种模式

会很有用。这个程序可能会作为cron作业执行,或者在基于定时任务的云环境里执行

D:\gocode\test\runner\runner.go

package runner

import ("errors"

"os"

"os/signal"

"time")//Runner在给定的超时时间内执行一组任务//并且在操作系统发送中断信号时候结束这些任务

type Runner struct{//interrupt 通道报告从操作系统//发送的信号

interrupt chan os.Signal//complete通道报告处理任务已经完成

complete chan error//timeout报告处理任务已经超时

timeout

tasks []func(int)

}var ErrTimeout = errors.New("received timeout")var ErrInterrupt = errors.New("received interrupt")/*返回一个新准备使用的Runner*/func New(d time.Duration)*Runner{return &Runner{//1个长度的通道 为了不阻塞

interrupt:make(chan os.Signal,1),

complete:make(chan error),

timeout:time.After(d),

}

}/*将一个任务附加到Runner上,这个任务是一个接收一个int类型的的id作为

参数的函数*/func (r*Runner)Add(tasks ...func(int)){

r.tasks=append(r.tasks,tasks...)

}//start 执行所有任务 并监视通道事件

func(r *Runner)Start() error{//我们希望接收所有中断信号

signal.Notify(r.interrupt,os.Interrupt)//用不同的协程执行不同的任务

go func() {

r.complete

}()select{//当任务处理完成时发出的信号

case err :=

case

}

}//执行每个已经注册的任务

func(r *Runner) run() error{for id,task :=range r.tasks{//检测操作系统中的中断信号

ifr.gotInterrupt() {returnErrInterrupt

}//执行已经注册的任务、

task(id)

}returnnil

}//验证是否接收到了中断信号

func(r *Runner) gotInterrupt() bool{select{case

signal.Stop(r.interrupt)return true

default:return false}

}

D:\gocode\test\listen20.go

package main

import ("log"

"os"

"test.com/runner"

"time")//规定了必须在3秒内完成任务

const timeout = 3*time.Second

func main(){

log.Println("starting work.")

r :=runner.New(timeout)

r.Add(createTask(),createTask(),createTask(),createTask())if err :=r.Start();err !=nil{switcherr {caserunner.ErrTimeout:

log.Println("任务超时")

os.Exit(1)caserunner.ErrInterrupt:

log.Println("强制退出程序")

os.Exit(2)

}

}

log.Println("运行完成.")

}/*返回一个根据id 休眠指定秒数的实例任务*/func createTask() func(idint){return func(id int){

log.Printf("processor - task #%d",id)

time.Sleep(time.Duration(id)*time.Second)

}

}

2020/04/25 17:24:12 starting work.

2020/04/25 17:24:12 processor - task #0

2020/04/25 17:24:12 processor - task #1

2020/04/25 17:24:13 processor - task #2

2020/04/25 17:24:15 任务超时

2020/04/25 17:24:26 starting work.

2020/04/25 17:24:26 processor - task #0

2020/04/25 17:24:26 processor - task #1

2020/04/25 17:24:27 强制退出程序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值