说起异步调度系统,大家肯定第一时间想到celery,但是celery是一个重量级的模块,当我们只想异步调度,没有其他需求的时候,完全可以自己实现一个异步调度系统。
那么如何实现自己的异步调度系统呢?
1.实现自己的消息队列
2.任务提交模块
- 任务调度处理模块
4.结果提取模块
5.如果是定时任务,还可以实现一个定时提交模块
消息队列:
可以使用Kafka、redis、也可以自己实现是一个存放任务的队列,队列里一般传入函数名,参数。
任务提交模块:
将任务相关信息传入消息队列。
任务相关信息通常可以有:
- 函数名
2.参数 - 正常完成的回调函数
- 异常完成的回调函数
结果调度模块:
需要考虑的事情:
1)如果要实现多个工作者处理任务,那么工作者是选择线程、还是子进程比较好?
个人想法:如果是i/o密集型任务,选择线程即可;如果是计算型任务,选择进程。如果选择进程实现工作者,还是要考虑工作者管理者模块进程是否需要成为守护进程。
2)调度方案
每个任务是那个哪个工作者空闲就哪个工作者处理,还是指定工作者。(笔者选择的是最简单的调度方案)
3)任务的结果处理
如果任务执行异常,需要什么操作。
如果任务执行正常,结果需要写在哪里?