>我有处理芹菜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
方法不应该只包含一次吗?
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
那么,当您以这种方式连接接收器时,到底发生了什么。您可能有 2 个注册的信号接收器,或者只有一个(最后一个注册的接收器获胜(,具体取决于id
是否返回相同的标识(详细了解 Celery 如何注册接收器并计算查找密钥。
@app.on_after_configure.connect
装饰器可帮助您在配置芹菜后注册接收器。接收方的名称不一定像维护接收方的签名那样重要。