celery注册异步函数是模块级别的,也就是同个模块不能有同名函数,比如搞个骚操作,将celery任务写在类中如下(注意这个静态方法是个特殊的装饰器,他实际是个描述器,他必须写在最上面)

实际注册的任务是apps.business.tasks.asd而不是apps.business.tasks.A.asd或者apps.business.tasks.B.asd,截图如下

那么当我们有两个同名函数生效哪个?可以发现被task装饰后他们的id是一样的也就是实际是同一个

同步运行结果如下,可以发现这有点抽象,当先调用A.asd()那么无论之后调用A.asd()或B.asd()都是打印asd,当先调用B.asd()那么无论之后调用A.asd()或B.asd()都是打印qwe

有点抽象的是当我们异步去调用他是调用第二个函数的打印,也就是后面的覆盖前面的


猜测可能是这样实现的导致同步调用时会发生谁先调用就变成谁(异步注册任务是另一套逻辑,这里给出的是可能造成同步调用时那种效果的示例demo),具体源码分析看另一篇文章
lis = {}def task(func):def w():if func.__name__ in lis:return lis[func.__name__]()else:lis[func.__name__] = funcfunc()return wclass B:@staticmethod@taskdef asd():print("asd")class A:@staticmethod@taskdef asd():print("qwe")B.asd()A.asd()