python - 如何只运行 Celery schedule 多次,直到再次调用任务?
问题描述
我正在使用 django + celery 任务调度程序来运行每月安排一次的任务。但我只想让这个任务运行几个月,例如 3 个月或 6 个月或 9 个月。
如何阻止工作人员执行进一步的任务,然后在再次调用该任务时重新启动?
这是我的任务
@task(name="add_profit")
def count():
portfolios = Portfolio.objects.filter(status='ACTIVE')
if portfolios.exists():
for portfolio in portfolios:
user = portfolio.user
#calculates portfolio profit
amount = portfolio.amount * 0.1
if portfolio.duration == '3 Months':
PortfolioProfit.objects.create(user=user, amount=amount)
user.useraccount.account_balance += amount
user.useraccount.save()
这是我的芹菜任务时间表
app.conf.beat_schedule = {
# Executes 1st day of every Month.
'every-minute': {
'task': 'add_profit',
# crontab can be changes to change Schedule
# http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html
'schedule': crontab(0, 0, day_of_month = 1),
},
}
解决方案
选项 1:您每月使用 celery crontab 条目启动任务,并在任务中添加测试:如果当前日期不在特定范围内,您只需退出处理。
这有一点开销,但每月一次的视线开销应该是可以接受的。
@task(name="add_profit")
def count():
today = datetime.datetime.now()
if today > datetime.datetime(2020,1, 1):
return
# the remaining part of your task follows here
选项 2:您执行一次(使用或不使用 for 循环)一个小代码片段,用于安排相关月份的任务。
http://docs.celeryproject.org/en/latest/userguide/calling.html#eta-and-countdown
在下面的示例中,我只是展示了在接下来的三天安排任务的想法:
today = datetime.utcnow()
for delta in range(1, 4):
task.apply_async(args=[arg1, arg2, ...), eta=today + timedelta(days=delta))
在这里,任务将按照您想要的频率执行。
但是,如果您将服务器迁移到其他位置,如果您重置 rabbitmq(或您拥有的任何代理),则要安排的任务将丢失/消失
推荐阅读
- php - 为 WooCommerce 中销售的产品启用免费送货
- python - 为什么记分卡没有响应我想要实现的内容
- linux - sonarqube.service 启动请求重复太快 - Sonarqube
- php - PHP 合并具有相同 ID 的数组
- swift - 无法从 Swift 中的 API 获取图像
- mysql - Sql查询连接2个表并计算匹配和不匹配行的值
- php - Laravel - 如何仅为双核安全禁用 CSRF
- ruby - 使用相同的键将嵌套哈希与 deep_merge 合并
- c# - Razor 页面中的多个表单
- javascript - req.body 的 ES6 语法中的解构给了我整个对象而不是特定值