任务被调用时__call__执行后,在调用函数(call_my_task)内部无法取得属性(_sid) 但是以-pool=solo 方式启动的话,没有问题。请教哪位同学见过类似问题吗?
# pool 并发方式 # worker_param = ['celery', '-A', 'app.celery', 'worker', '--pool=solo', '-l', 'INFO'] worker_param = ['celery', '-A', 'app.celery', 'worker', '--pool=prefork', '-l', 'INFO'] subprocess.Popen(worker_param) # task 类 class AloneTask(celery.Task): def __init__(self, *args, **kwargs): super(AloneTask, self).__init__() def __call__(self, *args, **kwargs): print(f">>>self1={self}") self._sid = kwargs.get('sid', '1') def my_func(self): # [ pool=solo ] self1==self2 # [ pool=prefork ] self1 !=self2 print(f">>>self2={self}") return self._sid # 调用 call_my_task.delay("100") @celery.task(base=AloneTask) def call_my_task(sid): # [ pool=solo ] OK # [ pool=prefork ] AttributeError: 'call_my_task' object has no attribute '_sid' print(call_my_task.my_func())
解决方案:通过一个全局变量来重置任务函数
g_task = None def __call__(self, *args, **kwargs): print(f">>>self1={self}") self._sid = kwargs.get('sid', '1') global g_task g_task = self def call_my_task(sid) call_my_task = g_task print(call_my_task.my_func())
![]() | 1 sunhk25 OP 以上代码是在 Windows 下执行的,Celery 从版本 4 之后虽然可以使用,但是不太维护。 在 Ubuntu 上测试了一下,上面的代码没有问题。 |
![]() | 2 opengo 2022-05-01 09:21:04 +08:00 |