【问题标题】:run celery tasks in random times随机运行 celery 任务
【发布时间】:2017-02-02 17:13:53
【问题描述】:

我需要在随机时间运行几个 celery 任务 - 每次运行都应该在一个新的随机时间 - 每次运行都应该生成随机数。
我过去做的是:

 "my_task": {
     "task": "path.to.my_task",
     "schedule": crontab(minute='*/%s' % rand),
 },
rand = random(1,12)

但是这段代码并不适合我的需求:
1. 我需要不同的(尽可能为每个租户使用 random0 号
2. 每次都会生成不同的数字,而不仅仅是在 settings.py 加载(一次)

我尝试按照THIS 答案中的说明覆盖日程安排,但没有奏效,有更好的方法吗?我错过了什么吗?

(例如,在租户 A 中,任务将在 23 点运行,后天在 8 点运行,在租户 B 中,任务将在 4 点运行,后天在 20 点运行等)

谢谢!

======== 更新====

在得到很好的答案后,我在任务中添加了选项,并按照建议在 apply_asynch 方法中处理它 -
.

"my-task": {  # deprecated task
               "task": "mdm_sync.tasks.test_task",
               # "schedule": new_sc(),
               "schedule": crontab(minute=39, hour=11),
                "options": {
                    "eta": datetime.utcnow()
                }
},


entry.options["eta"] = datetime.datetime.utcnow() + datetime.timedelta(seconds=random(3600,12*3600)

效果很好!

【问题讨论】:

    标签: python django celery celerybeat


    【解决方案1】:

    我遇到了类似的问题,我必须在随机时间间隔

    随机用户之间生成类似facebook的通知

    最初我也和你做同样的事情,使用random 函数将minute 值赋予crontab。但是,当您点击 python manage.py runserver 时,settings.pycelery.py 仅加载一次,因此该随机函数仅运行一次,因此该随机值仅选择一次,例如 5 分钟7 分钟,但随后此随机值用于每 5 或 7 分钟重复一次任务,因此使任务定期重复

    因此,您需要做的是,您需要递归调用tasks.py 中的函数/方法,而不是在settings.pycelery.py 中定义任务时间。但这里的关键是你需要递归异步调用同一个函数,并且在异步调用的同时,你需要传递一个参数delay,其值将由使用随机函数

    见我的tasks.py -> https://github.com/ankushrgv/notification/blob/master/apps/notifications/tasks.py

    celery.py -> https://github.com/ankushrgv/notification/blob/master/config/celery.py

    您必须 python manage.py shell 然后从那里调用函数/方法一次才能开始递归。

    类似

    `myFunction().apply_async()`
    

    在我的情况下,它曾经是

    `CreateNotifications().apply_async()`
    

    【讨论】:

    • 乐于助人。 :)
    猜你喜欢
    • 2015-10-24
    • 2011-09-15
    • 2019-02-16
    • 2014-03-17
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2017-02-26
    • 2011-05-05
    相关资源
    最近更新 更多