随机运行芹菜任务

时间:2016-09-25 07:47:49

标签: python django celery celerybeat

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

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

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

我试图按照THIS回答中的说明覆盖Schedule,但它没有用,有更好的方法吗?我错过了什么吗?

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

谢谢!

======== update ====

在我得到了很好的答案之后,我为我的任务添加了选项,并按照建议的方法在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)

效果很好!

1 个答案:

答案 0 :(得分:1)

我遇到了一个类似的问题,我必须在随机用户之间生成 facebook 随机时间间隔

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

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

查看我的tasks.py - &gt; https://github.com/ankushrgv/notification/blob/master/apps/notifications/tasks.py

celery.py - &gt; https://github.com/ankushrgv/notification/blob/master/config/celery.py

你必须python manage.py shell,然后只从那里调用函数/方法开始递归。

类似

`myFunction().apply_async()`

在我的情况下,它曾经是

`CreateNotifications().apply_async()`