celery5.2.1以下版本任务调用多耗费1秒
2021年12月28日 10:14
问题
5.0.5版本celery存在一个缺陷, 调用任务耗时多用1秒
这个问题在5.2.0, 5.1.2同样存在
没理解为什么到5.2.1版本才解决,甚至一度把celery排除python技术栈
环境描述
1 2 3 | python3. 6 celery5. 0.5 windows 32 位 |
调用celery任务代码摘要
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # 1 .send_task返回AsyncResult # 2 .AsyncResult的 get ()等待返回结果 # 3 . get ()会比真实多耗费 1 秒,并且每次请求都会出现 from celery import Celery class xxxCelery(Celery): def call_xxx(self, name, timeout= 120 , **kwargs): LOG.info( "send_task: %s" % locals()) start = time.time() r = self.send_task(name, **kwargs) g = eventlet.spawn(r. get , timeout=timeout) result = g.wait() print( "cost: %s" % time.time()-start) return |
两个版本比对
分析celery源码之后,可以知道问题在drain_events()内部, 比较5.2.0和5.2.1版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #celery/backends/asynchronuse.py class greenletDrainer(Drainer): ... def run(self): self._started. set () while not self._stopped.is_set(): try : self.result_consumer.drain_events(timeout= 1 ) # 新增了两句, 估摸着是这个问题 self._send_drain_complete_event() self._create_drain_complete_event() except socket.timeout: pass self._shutdown. set () |
解决办法
celery升级到5.2.1
python要升级到3.7以上版本(celery要求python3.7以上版本)
解决效果
耗时从1000多ms变成了30ms