定时任务:
schedule与apscheduler与celery
量级: schedule < apscheduler < celery
三者都支持定时任务配置:
-- schedule相当于linux下的crontab,使用最简单,但不支持动态添加任务和任务实例化,所以在实际项目中使用不多。
-- apschedule解决了schedule的不足,项目中定时任务使用最多
-- celery 的功能强点在异步队列,定时功能只是一个附加功能,如果只为定时而使用celery则太过笨重,杀鸡用牛刀。
想想定时任务需支持的几个关键点:
1.触发方式: 按照特定频率/特定时间
2.调度方法:阻塞/非阻塞/异步
3.任务的实例化,为什么实例化?具体使用看应用场景:
-- 如果重启了一切重来,就按照默认的任务存内存,简单高效;
-- 当程序崩溃或应用重启时,还需要保持定时任务的正常流程,比如(程序A每两个小时运行一次,10点运行了,11点应用重启,那么还会维持下次在12点执行,因为任务的调度已经实例化到数据库),
实例化的时候又要考虑,任务重复添加到数据库的问题,不急。有相关配置,是替换还是继续添加,追加就会存在同时有多个任务同时进行。
4.任务的执行,是采用多线程还是多进程?看你是CPU密集型还是IO密集型,如果是后者就没必要浪费进程数了,也可以二者结合使用。
当任务未执行完毕,下次调度又触发了,是要多个一起执行还是只保留一个实例,或配置实现可以最多运行n个实例?
5.异常,当发生异常时如何第一时间知道
celery:
作为一个异步队列,可以支持高并发,如百万级别。当项目启动时,遇到celery的 delay方法时,程序会直接跳过然后将该方法加入到配置的消息中间件(broker,如redis,rabbitMQ)中。
而启动的worker则会进行消费任务。
集群与分布式:
集群是不同的机器运行相同的代码,处理相同的事情,比如两个厨师同时炒菜
分布式是不同的机器做不同的事,相互协作。比如厨师和切菜师
来源:https://www.cnblogs.com/yeteng/p/12180262.html