安排芹菜任务在可能遥远的将来运行

celery-longterm-scheduler的Python项目详细描述


使用单独的 存储后端(当前仅支持redis)与 任人唯亲。

用法

  • 通过在芹菜配置中添加类似longterm_scheduler_backend = 'redis://localhost:6739/1'的设置来配置存储。 (存储也尊重内置的芹菜配置设置 redis_socket_timeoutredis_socket_connect_timeoutredis_max_connections
  • 将芹菜应用程序配置为使用自定义任务类 MYCELERY = celery.Celery(task_cls=celery_longterm_scheduler.Task)
  • 设置一个cronjob以运行celery longterm_scheduler(例如,每5分钟一次)
  • 现在你可以通过打电话来安排你的任务 mytask.apply_async(args, kwargs, eta=datetime)正常。这又回来了 一个普通的AsyncResult对象,但只支持读取.id。 任何其他方法或属性都可能显式或隐式失败。
  • 您可以通过调用 celery_longterm_scheduler.get_scheduler(MYCELERY).revoke('mytaskid') (我们无法连接到芹菜内置的AsyncResult.revoke(), 不幸的是)。revoke()成功时返回true,如果给定 在存储后端找不到任务(例如,因为它已经来了 到期并被执行)。

而不是给芹菜经纪人发送一份正常的工作(增加了时间安排 信息),这将在调度程序存储后端中创建作业条目。这个 然后,cronjob定期检查存储中是否有任何到期的作业,以及 然后才把一份普通的芹菜工作交给经纪人。

基本原理

为什么不使用芹菜内置的apply_async(eta=)?因为你永远不能 确实要删除挂起的作业。AsyncResult('mytaskid').revoke()只能添加 任务id到statedb,在那里它必须永远保存,所以任务是 确认为已撤销。对于计划在6个月内运行的作业,或者 稍后,这将创建一个无法管理、不断增长的statedb。

为什么不用芹菜?因为它是为周期性工作而建的,我们需要 单枪匹马的工作。从芹菜中没有多少收获 实现,特别是因为我们想使用redis作为存储 已经将其用作代理和结果后端)。

实施

redis模式

芹菜长期调度器假设它与专用的redis数据库通信。 它使用^{tt15}为每个计划作业创建一个条目$ (作业配置用json序列化)并使用名为 scheduled_task_id_by_time,包含由unix评分的jobid 到期时间戳(UTC)。

运行测试

使用toxpy.test。可能安装tox(例如,通过pip install tox) 然后简单地运行tox

对于集成测试,您需要安装redis二进制文件(测试 开始their own server)。

芹菜长期计划更改

1.0.1(2018-01-17)

  • 不要试图安排apply_async(eta=None)通话

1.0.0(2017-09-29)

  • 初始版本

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
带有外部属性文件的java prunsrv服务   java NoClassDefFoundError:org/hibernate/annotations/common/reflection/MetadataProvider   使用Android Studio进行java单元测试云数据存储   java如何使用Junit在SeleniumWebDriver中生成测试用例报告   java根据用户输入显示多个动画形状(JavaFX)   java枚举文件和Jar资源的统一机制   使用Spring OXM的java多封送器/解封器   java无法解析:com。谷歌。安卓exoplayer:exoplayer smoothstreaming:2.9.1   java如何创建迷你对话框(带图片)   java在eclipse中单击自定义菜单项时显示一个对话框   java使用Hibernate在插入前检查重复值   Jsoup只过滤掉从html到文本的一些标记   域在字符串Java Mail中包含非法字符   自定义Jackson反序列化程序中的java委托   java Graphql联合在扩展关系上返回null   java如果我有entitymanager,如何获取会话对象?