IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    妙音发表于 2021-12-28 09:57:16
    love 0

    问题

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


沪ICP备19023445号-2号
友情链接