celery是Python的一个散布式任务队列,可以用于处理需要长时间运行或复杂计算的任务。它支持在不同的机器之间调度和分发任务,并且可以根据任务的优先级、依赖关系等进行管理。

celery定时任务不执行-celery定时任务

celery可以用来实现游戏中的定时任务,例如每天自动更新玩家的游戏等级、每天定时清算服务器内存、每周统计玩家的游戏时间等等。这些任务可以依照指定的时间间隔或条件触发,而且celery还提供了日志记录、毛病处理等功能,可以帮助开发者更好地管理和监控这些任务。

使用celery定时任务的关键是要有一个清晰的任务定义和调度策略。开发者需要肯定任务的具体内容、履行方式、依赖关系等,并使用celery的配置文件来设定任务的调度规则。例如,可以设定每天清晨1点履行所有游戏等级更新任务,每小时清算一次服务器内存,每周统计一次玩家的游戏时间等等。

简单强大的Python库!Schedule—实用的周期任务调度工具

如果你想在Linux服务器上周期性地执行某个 Python 脚本,最出名的选择应该是 Crontab 脚本,但是 Crontab 具有以下缺点

1.不方便执行 秒级的任务

2.当需要执行的定时任务有上百个的时候,Crontab的 管理就会特别不方便

另外一个选择是 Celery,但是 Celery 的配置比较麻烦,如果你只是需要一个轻量级的调度工具,Celery 不会是一个好选择。

在你想要使用一个轻量级的任务调度工具,而且希望它尽量简单、容易使用、不需要外部依赖,能够容纳 Crontab 的所有基本功能,那么 Schedule 模块是你的不二之选。

使用它来调度任务可能只需要几行代码,感受一下

上面的代码表示每10分钟执行一次 job 函数,非常简单方便。你只需要引入 schedule 模块,通过调用 scedule.every(时间数).时间类型.do(job)发布周期任务。

发布后的周期任务需要用 run_pending函数来检测是否执行,因此需要一个 While循环不断地轮询这个函数。

下面具体讲讲Schedule模块的安装和初级、进阶使用方法。

1.准备

请选择以下任一种方式输入命令安装依赖

1. Windows 环境 打开 Cmd (开始-运行-CMD)。

2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。

3. 如果你用的是 VSCode编辑器 或 Pycharm,可以直接使用界面下方的Terminal.

2.基本使用

最基本的使用在文首已经提到过,下面给大家展示更多的调度任务例子

可以看到,从月到秒的配置,上面的例子都覆盖到了。不过 如果你想只运行一次任务 的话,可以这么配

参数传递

如果你有参数需要传递给作业去执行,你只需要这么做

获取目前所有的作业

如果你想获取目前所有的作业

取消所有作业

如果某些机制触发了,你需要立即清除当前程序的所有作业

标签功能

在设置作业的时候,为了后续方便管理作业,你可以给作业打个标签,这样你可以通过标签过滤获取作业或取消作业。

设定作业截止时间

如果你需要让某个作业到某个时间截止,你可以通过这个方法

截止日期之后,该作业将无法运行。

立即运行所有作业,而不管其安排如何

如果某个机制触发了,你需要立即运行所有作业,可以调用 schedule.run_all:

3.高级使用

装饰器安排作业

如果你觉得设定作业这种形式太啰嗦了,也可以使用装饰器模式

并行执行

默认情况下,Schedule 按顺序执行所有作业。其背后的原因是,很难找到让每个人都高兴的并行执行模型。

不过你可以通过多线程的形式来运行每个作业以解决此限制

日志记录

Schedule 模块同时也支持 logging 日志记录,这么使用

效果如下

异常处理

Schedule 不会自动捕捉异常,它遇到异常会直接抛出,这会导致一个严重的问题 后续所有的作业都会被中断执行 ,因此我们需要捕捉到这些异常。

你可以手动捕捉,但是某些你预料不到的情况需要程序进行自动捕获,加一个装饰器就能做到了

这样, bad_task在执行时遇到的任何错误,都会被 catch_exceptions 捕获,这点在保证调度任务正常运转的时候非常关键。

定时任务

Celery的架构由三部分组成, 消息中间件(message broker) 任务执行单元(worker) 任务执行结果存储(task result store)组成。

消息中间件

Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括,RabbitMQ,Redis,MongoDB(experimental),Amazon SQS (experimental),CouchDB (experimental), SQLAlchemy (experimental),Django ORM (experimental), IronMQ

任务执行单元

Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中。

任务结果存储

Task result store用来存储Worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括 AMQP,redis,memcached,mongodb,SQLAlchemy, Django ORM,Apache Cassandra,IronCache 等。

这里我先不去看它是如何存储的,就先选用redis来存储任务执行结果。

因为涉及到消息中间件(在Celery帮助文档中称呼为中间人<broker>),为了更好的去理解文档中的例子,可以安装两个中间件,一个是RabbitMQ,一个redis。

根据 Celery的帮助文档 安装和设置RabbitMQ, 要使用 Celery,需要创建一个 RabbitMQ 用户、一个虚拟主机,并且允许这个用户访问这个虚拟主机。

异步任务将耗时操作任务提交给 Celery 去异步执行,比如发送短信/邮件、消息推送、音处理等等

定时任务定时执行某件事情,比如每天数据统计

实现定时任务的方法有很多,接下来我们针对各种方法对比下优缺点。

sched模块实现了一个时间调度程序,该程序可以通过单线程执行来处理按照时间尺度进行调度的时间。

通过调用scheduler.enter(delay,priority,func,args)函数,可以将一个任务添加到任务队列里面,当指定的时间到了,就会执行任务(func函数)。

执行结果为

按顺序执行任务

执行结果为

s.run()会阻塞当前线程的执行

可以用

也可以用s.cancal(action)来取消sched中的某个action

APScheduler有四种组件

示例2、

示例3、

示例4、

运行结果为

示例5、

运行结果

示例6、

示例7、

缺点 遇到问题排查时比较困难。

精讲见celery

优点 基于Redis的作业队列工具,优先选择APScheduler定时框架。小而精。

缺点 没有定时执行的功能。

后续精讲持续更新中。。。

可以将所需要的Python程序打包成exe文件,然后在windows下设置定时执行。

常见

Windows 任务计划程序

Windows Service

SQL Agent 的 Job

优点 可以管理和调度多个任务,可以进行控制。

缺点 阻塞式函数

优点 不需要程序自己维护定时器,不占用程序的资源。

缺点 不太灵活,crontab因为是操作系统的命令,独立于程序运行,所以也就是在程序还没有运行的时候,就已经确定了有哪些定时任务需要执行,并东提前交代给了Linux系统,如果程序运行当中,发现有新的定时任务需求,想要让程序自动交代给crontab一个新的定时任务,并不是很方便。

语法

说明

参数说明

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。