celery骚操作之把任务写在类中可能造成的问题

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

实际源码如下
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值