Celery 任务 prefork 多进程启动时,如何通过自定义类的__call__函数设置属性

2022-02-16 13:09:46 +08:00
 sunhk25

任务被调用时__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())
2382 次点击
所在节点    Python
2 条回复
sunhk25
2022-02-16 18:53:45 +08:00
以上代码是在 Windows 下执行的,Celery 从版本 4 之后虽然可以使用,但是不太维护。
在 Ubuntu 上测试了一下,上面的代码没有问题。
opengo
2022-05-01 09:21:04 +08:00
@celery.task(bind=True, base=AloneTask)
def call_my_task(self, sid):
print(self._sid)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/834205

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX