引子

任务调度(Task Scheduling)是很多软件系统中的重要组成部分,字面上的意思是按照一定要求分配运行一些通常时间较长的脚本或程序。在爬虫管理平台 Crawlab 中,任务调度是其中的核心模块,相信不少朋友会好奇如何编写一个任务调度系统。本篇文章会教读者用 Go 语言编写一个非常简单的任务调度系统。

思路

我们首先理清一下思路,开发最小化任务调度器需要什么。

  • 交互界面(API)
  • 定时任务(Cron)
  • 任务执行(Execute Tasks)

整个流程如下:

我们通过 API 创建定时任务,执行器根据定时任务标准定期执行脚本。

实战

交互界面

main.gogin
api.go

定时任务

然后是任务调度的核心,定时任务。这里我们使用 robfig/cron,Go 语言比较流行的定时任务库。

cron.goCronrobfig/cronCron

现在创建好了主要定时任务实例,就可以将核心逻辑添加在刚才的 API 占位区域了。

api.go
AddJobCron.AddFunc

任务执行

exec.goos/exec

好了,现在我们将这部分执行代码逻辑放到之前的占位区域中。

代码效果

OK,大功告成!现在我们可以试试运行这个极简的任务调度器了。

go run .
curl -X POST -d '{"cron":"* * * * *","exec":"touch /tmp/hello.txt"}' http://localhost:9092/jobs/tmp/hello.txt

{"id":1}

curl http://localhost:9092/jobs

[{"id":1,"next":"2022-10-03T12:46:00+08:00"}]

这表示下一次执行是 1 分钟之后。

ls -l /tmp/hello.txt

-rw-r--r--  1 marvzhang  wheel     0B Oct  3 12:46 /tmp/hello.txt

也就是说,执行成功了,大功告成!

总结

本篇文章通过将 Go 语言几个库简单组合,就开发出了一个极简的任务调度系统。所用到的核心库:

  • os/exec