我试图实现一个任务,其中全局变量在两个不同的Celery任务之间共享。为此,我继承了任务类并使用了属性。根据celery文档,当调用新任务时,基类将初始化。我们有一种方法可以在任务之间重用对象吗?我们可以覆盖运行吗()方法从任务?如果我们覆盖运行方法。我们如何注册任务?与celery 使用celery 5.X?尝试序列化对象..任何替代方法将不胜感激。
class handler(Task):
def __init__(self):
self.base_obj = ""
@property
def global_handler(self):
return self.global_thread_handler
@property
def base_handler(self):
return self.base_obj
@app.task(base=handler)
def test123():
test123.base_handler = cls1()
@app.task(base=handler)
def test456():
test456.base_handler.method()
2条答案
按热度按时间6g8kf2rb1#
Celery
使用多个进程来异步运行任务。无论您使用什么Task类,它都只能在worker中可见。如果您想在进程之间共享变量,则必须使用multiprocessing
特定的对象才能在单个进程之外共享值。:如果我们运行:
日志如下所示:
可以看到,
ForkPoolWorker-3
能够读取在ForkPoolWorker-2
中设置的值由于锁和并发问题,你必须小心使用共享变量。
fhg3lkii2#
在Celery中注册一个任务可以简单地使用如下方法完成:
我认为你不可能在任务中重用对象。有人能纠正我吗?