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()