来自不同模块的芹菜中的定期任务

时间:2018-01-18 06:47:08

标签: python celery

我有使用芹菜app.py的主文件 除了文件中的其他信息,我还有以下内容:

app = Celery(__name__, include=['tasks.parsers', 'tasks.statistics'])

我的档案tasks.parsers包括:

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    sender.add_periodic_task(
        crontab(hour=23, minute=0),
        task_parsers()
    )

我的档案tasks.statistics包括:

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    sender.add_periodic_task(
        crontab(hour=2, minute=0),
        task_statistics()  
    )

我的主要目标是使用芹菜,包括来自不同python模块的定期任务。在提供的示例中,这是一种正确的方法吗?他们不会互相覆盖吗?不应该只包含一次setup_periodic_tasks方法吗?

1 个答案:

答案 0 :(得分:0)

  

TLDR :为接收者使用唯一的名称。

目前以这种方式注册接收器可能会让人心碎。

现在,可能需要使用相同名称和相同块重新定义的函数每次生成不同的标识。你不会这么看。 Python有时会为重新定义的函数重用相同的内存地址。

>>> def foo(): print('bar')
...
>>> print(id(foo))
4307375360

>>> def foo(): print('bar')
...
>>> print(id(foo))
4307375240

>>> def foo(): print('bar')
...
>>> print(id(foo))
4307375360

当你以这种方式连接你的接收器时,真正发生了什么。 根据{{​​1}}是否返回相同的身份(Learn more about how Celery registers a receiver and computes a lookup key),您可能有2个注册的信号接收者或只有一个(最后注册的接收者获胜)。

id装饰器可帮助您在配置芹菜后注册接收器。接收器的名称不一定与维护接收器的签名一样重要。