我需要在随机时间运行几个芹菜任务 - 每次运行都应该在一个新的随机时间 - 每次运行应该生成随机数。
我过去所做的是:
"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)
效果很好!
答案 0 :(得分:1)
我遇到了一个类似的问题,我必须在随机用户之间生成 facebook ,随机时间间隔
最初我也和你一样,使用random
函数将minute
值赋予crontab
。但是,由于settings.py
和celery.py
仅在您点击python manage.py runserver
时加载一次,因此该随机函数仅运行一次,因此该随机值仅选择一次,例如 5分钟< / strong>或 7分钟,但此随机值用于每5或7分钟重复一次任务,从而使任务定期重复。
因此,您需要做的是,不要在settings.py
或celery.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()`