From f39d0ac508beadb428f337c2faebbd1b2a6f5e8e Mon Sep 17 00:00:00 2001 From: ouqiang Date: Mon, 13 Mar 2017 17:21:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E4=BF=9D=E5=AD=98=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=9A=84map=E5=8A=A0=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/cron_task.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/utils/cron_task.go b/utils/cron_task.go index b0969cc..8572f8a 100644 --- a/utils/cron_task.go +++ b/utils/cron_task.go @@ -4,19 +4,20 @@ import ( "github.com/robfig/cron" "errors" "scheduler/utils/app" + "sync" ) -// todo map并发访问加锁 - var DefaultCronTask CronTask; type CronTask struct { + sync.RWMutex tasks map[string]*cron.Cron } func init() { if app.Installed { DefaultCronTask = CronTask{ + sync.RWMutex{}, make(map[string]*cron.Cron), } } @@ -31,6 +32,8 @@ func(cronTask *CronTask) Add(name string, spec string, cmd func() ) error { return errors.New("任务已存在") } + cronTask.Lock() + defer cronTask.Unlock() cronTask.tasks[name] = cron.New() err := cronTask.tasks[name].AddFunc(spec, cmd) @@ -49,6 +52,8 @@ func(cronTask *CronTask) addOrReplace(name string, spec string, cmd func() ) err // 判断任务是否存在 func(cronTask *CronTask) IsExist(name string) bool { + cronTask.RLock() + defer cronTask.RUnlock() _, ok := cronTask.tasks[name] return ok @@ -71,14 +76,15 @@ func(cronTask *CronTask) Stop(name string) { // 删除任务 func(cronTask *CronTask) Delete(name string) { cronTask.Stop(name) - cronTask.tasks[name] = nil + cronTask.Lock() + defer cronTask.Unlock() delete(cronTask.tasks, name) } // 运行所有任务 func(cronTask *CronTask) run() { for _, cron := range cronTask.tasks { - // cron内部有开启goroutine,此处不用新建 + // cron内部有开启goroutine,此处不用新建goroutine cron.Start() } } \ No newline at end of file