Go语言任务调度与控制

需求:

  1. 任务可以手动触发
  2. 任务可以自动触发
  3. 任务可以正常执行完毕结束
  4. 任务可以被手动中止
  5. 任务可以在超过指定时间后自动结束(超时机制)

不费话,上代码:

package main

import (
	"context"
	"log"
	"time"
)

func main() {
	var autoTimeout = 8
	ctx, timeout := context.WithTimeout(context.Background(), time.Duration(autoTimeout) * time.Second)
	go watch(ctx,"【监控】")

	// 下面这个manual比autoTimeout大,就会让watch走自动超时,如果比autoTimeout小,就会调超时函数(也就是手动触发了超时让子goroutine结束)
	var manual = 10
	time.Sleep(time.Duration(manual) * time.Second)
	log.Println("可以了,通知监控停止")
	timeout()
	log.Println("main等待")  // 这里是手动触发了timeout之后,等待一下看看结果,测试性质的代码
	time.Sleep(2 * time.Second)
	log.Println("main结束")
}

func watch(ctx context.Context, name string) {
	defer func() {
		log.Println(name, "监控子goroutine返回")
	}()
	ch := make(chan int)
	done := make(chan int)
	go func() {
		for i := 0; i < 5; i++ {
			time.Sleep(time.Second)
			ch <- i
		}
		done <- 1
	}()
	for true {
		select {
		case n := <- ch:
			log.Println(name, "goroutine任务执行中...", n)
		case n := <- done:
			log.Println(name, "goroutine正常完成...", n)
			return
		case <-ctx.Done():
			log.Println(name, "监控中止:", ctx.Err())
			return
		}
	}
}

实际使用时,可以将上述任务相关的东西封装到一个struct中就可以实现抽象和内聚了,上述代码亲测覆盖所有需求没问题,分享给大家。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网速递520

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值