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__] = func
func()
return w
class B:
@staticmethod
@task
def asd():
print("asd")
class A:
@staticmethod
@task
def asd():
print("qwe")
B.asd()
A.asd()
实际源码如下