目录

celery5.2.1以下版本任务调用多耗费1秒

问题

5.0.5版本celery存在一个缺陷, 调用任务耗时多用1秒

这个问题在5.2.0, 5.1.2同样存在

没理解为什么到5.2.1版本才解决,甚至一度把celery排除python技术栈

环境描述

python3.6
celery5.0.5
windows 32位

调用celery任务代码摘要

# 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版本

#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

佛說大乘無量壽莊嚴清淨平等覺經pdf 净土大经科注2014-doc 此生必看的科学实验-水知道答案 印光大师十念法(胡小林主讲第1集)