python-3.x - 为什么只创建一个周期性任务?
问题描述
我想通过循环创建多个周期性任务,但只创建了列表的最后一个。例如:
@app.on_after_finalize.connect
def setup_periodic_tasks(sender, **kwargs):
a = [1,3,4,7,8,10]
for i in a:
sender.add_periodic_task(crontab(hour=i), task.s())
在我运行 celery beat -A tasks -l debug 的任务计划中,我只看到 10 点执行的任务。为什么?
解决方案
任务按键存储在字典中。密钥由name
参数或参数的repr()
给出sig
。这里的sig
论点是task.s()
,每个循环都是一样的。因此,当它通过循环时,它会为每个计划覆盖相同的键。要修复提供唯一名称:
sender.add_periodic_task(crontab(hour=i), task.s(), name='whatever-{}'.format(i))
以下是来自的相关来源celery
:
def add_periodic_task(self, schedule, sig,
args=(), kwargs=(), name=None, **opts):
key, entry = self._sig_to_periodic_task_entry(
schedule, sig, args, kwargs, name, **opts)
if self.configured:
self._add_periodic_task(key, entry)
else:
self._pending_periodic_tasks.append((key, entry))
return key
def _sig_to_periodic_task_entry(self, schedule, sig,
args=(), kwargs={}, name=None, **opts):
sig = (sig.clone(args, kwargs)
if isinstance(sig, abstract.CallableSignature)
else self.signature(sig.name, args, kwargs))
return name or repr(sig), { # <------------------------------- key created here
'schedule': schedule,
'task': sig.name,
'args': sig.args,
'kwargs': sig.kwargs,
'options': dict(sig.options, **opts),
}
def _add_periodic_task(self, key, entry):
self._conf.beat_schedule[key] = entry # <--------------------- key can be overwritten
编辑: 正如@GharaniMohamed 所指出的,文档声明的hour
参数chrontab
可以是“一个(列表)从 0-23 的整数,代表一天中应该执行的时间。 ”所以处理这个的更好方法是完全删除循环:
@app.on_after_finalize.connect
def setup_periodic_tasks(sender, **kwargs):
a = [1,3,4,7,8,10]
sender.add_periodic_task(crontab(hour=a), task.s())
推荐阅读
- jwt - 如何使用 Auto-Auth 设置 Vault JWT 身份验证?
- angular - 焦点不是从身体角度可访问性开始
- css - 如何在框中设置动态边距
- sql - ORACLE CONNECT BY LEVEL 产生重复行并产生性能问题
- python - 关于如何使用面向对象编程来简化程序的任何想法
- regex - 使用多行正则表达式获取 grep 上下文
- python - 匹配python中2组列表中最相似的列表
- linux - 如何将 jar 文件从位于 myfolder/folderName 的文件夹中复制到 Fedora Linux 中的 urs/lib/jvm/java-1.8/jre/lib/etc?
- python - 使用 scipy 将阻尼正弦波拟合到数据中
- java - 仅提取十进制值以将 .Miles 转换为 Yards