首先,我有一个使用芹菜运行的模块。
其次我有另一个模块,我跑来把任务推给芹菜工人。它导入第一个模块并将其称为异步。
现在第一个模块加载一些只需要加载一次的大文件。我希望在芹菜开始时加载,但是当我运行第二个模块将任务推到芹菜上时,我不希望再次导入这些文件。
我是否可以使用celery调用一个函数,以便在初始化worker时首次加载,然后在运行第二个模块时再次调用此函数,而第二个模块只是将任务推送给worker?
干杯
答案 0 :(得分:1)
实现这一目标的最简单方法是将模块传递给您的芹菜工人,而不是让他们自己导入它。
例如,像这样
导入big_module
tasks = [foo.s(big_module),foo.s(big_module)...]
现在,在foo内部,而不是导入模块,只需像访问任何其他对象一样访问它。
答案 1 :(得分:1)
每个worker将任务实例化为单例,因此您可以在任务对象中缓存所需的任何内容。
听起来你想在不同的任务之间分享。在这种情况下,您可以创建自己的单例。每个工人将加载一次。如果你想让多个工作人员共享它,你需要一个缓存(memcache,redis,django db,一个优化文件,?)。