不确定超时有没有得到控制

来源:10-2 课程总结&课后练习

wenxin_天涯

2019-11-11

老师 超时处理代码:

func (e *Executor) JobOvertimeHandle(result *basics.JobExecuteResult) {
	go func(result *basics.JobExecuteResult) {
		//获取当前时间
		var(
			seconds time.Duration
			overtime time.Time
		)
		//格式化时间
		seconds , _ = time.ParseDuration("-" + strconv.FormatInt(result.ExecuteInfo.Job.Overtime , 10))
		for {
			//超时时间
			overtime = result.StartTime.Add(seconds)
			//如果超时时间大于或等于当前时间  退出当前进程
			if overtime.Before(result.StartTime) ||  overtime.Equal(result.StartTime){
				result.ExecuteInfo.CancelFunc()	//触发command杀死shell子进程, 任务得到退出
				return
			}

			time.Sleep(1 * time.Second)
		}
	}(result)
}

结果:
执行任务: job1 2019-11-11 04:28:48 +0800 CST 2019-11-11 04:28:48.0000114 +0800 CST m=+0.889000001
执行任务: job3 2019-11-11 04:28:48 +0800 CST 2019-11-11 04:28:48.0000114 +0800 CST m=+0.889000001
任务执行完成: job3  context canceled
任务执行完成: job1  context canceled
执行任务: job3 2019-11-11 04:28:51 +0800 CST 2019-11-11 04:28:51.0000114 +0800 CST m=+3.889000001
执行任务: job1 2019-11-11 04:28:51 +0800 CST 2019-11-11 04:28:51.0000114 +0800 CST m=+3.889000001
任务执行完成: job3  context canceled
任务执行完成: job1  context canceled
执行任务: job1 2019-11-11 04:28:54 +0800 CST 2019-11-11 04:28:54.0000114 +0800 CST m=+6.889000001
执行任务: job3 2019-11-11 04:28:54 +0800 CST 2019-11-11 04:28:54.0000114 +0800 CST m=+6.889000001
任务执行完成: job3  context canceled
任务执行完成: job1  context canceled

老师这是超时终止的结果吗?
写回答

1回答

小鱼儿老师

2019-11-15

嗯,context canceled就是因为我们在循环中判定任务已经超时了,所以主动调用了cancelFunc(),导致正在执行的Command子进程被杀死。

0
1
慕娘4195536
这里能不能不用CancelFunc来杀死进程,直接给CancelCtx设置超时时间可以吗? 还有这里需要区分超时和主动杀死进程的区别,都用cancelfunc怎么区分?
2020-12-22
共1条回复

Go语言开发分布式任务调度 轻松搞定高性能Crontab

分布式系统设计+高并发细节处理,一次性让你“晋级”到位

1136 学习 · 177 问题

查看课程