协程调度报错

来源:8-12 保存任务日志到mongodb(中)

wenxin_天涯

2019-11-10

//初始化调度器
func InitScheduler() (err error) {
	//初始化调度协程参数
	W_Scheduler = &Scheduler{
		JobEventsChan: make(chan *basics.JobEvent , 1000),
		JobPlanTable: make(map[string]*basics.JobSchedulerPlan),
		JobExecuteTable: make(map[string]*basics.JobExecuteInfo),
		JobResultChan: make(chan *basics.JobExecuteResult , 1000),
	}

	//启动调度协程
	go W_Scheduler.StartScheduler()

	return
}

//启动调度器
func (s *Scheduler) StartScheduler() () {
	var (
		jobEvent *basics.JobEvent
		scheduleAfter time.Duration
		scheduleTimer *time.Timer
		result *basics.JobExecuteResult
	)
	//初始化一次(1秒)
	scheduleAfter = s.TryScheduler()
	//调度的延迟定时器
	scheduleTimer = time.NewTimer(scheduleAfter)

	//监听任务事件
	for {
		select {
		case jobEvent = <- s.JobEventsChan:	//任务事件
			//对内存中维护的任务列表做增删改查
			s.HandleJobEvent(jobEvent)
		case <- scheduleTimer.C:	//最近的任务时间到期
		case result = <- s.JobResultChan: 	//监听任务执行结果
			s.HandleJobResult(result)
		}
		//调度一次任务
		scheduleAfter = s.TryScheduler()
		//重置调度间隔
		scheduleTimer.Reset(scheduleAfter)
	}
}

运行结果报错:

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x28 pc=0x900466]

goroutine 1 [running]:
github.com/golang-crontab/worker.InitJobAndListen(0x0, 0x0)
	E:/GO/src/github.com/golang-crontab/worker/JobInit.go:48 +0xc6
main.main()
	E:/GO/src/github.com/golang-crontab/worker/main/worker.go:60 +0x173

但是 W_Scheduler.StartScheduler()这样调度可以 老师请问这是什么原因

写回答

1回答

wenxin_天涯

提问者

2019-11-11

调试找到问题了!老师不用回答了

1
1
小鱼儿老师
好的~
2019-11-15
共1条回复

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

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

1136 学习 · 177 问题

查看课程