python异步任务处理框架celery

2020年06月03日 未雨晴空 0评论 1746阅读 2喜欢

关于Celery

Celery 是一款非常简单、灵活、可靠的分布式系统,可用于处理大量消息,并且提供了一整套操作此系统的一系列工具,同时Celery也是一款消息队列工具,可用于处理实时数据以及任务调度。

Celery关键词概念

  • Task

    异步任务和定时任务

  • Broker

    表示中间人,作用是负责接收生产者发布的任务并将任务存入队列,然后等待任务的消费者也就是下面的Worker来处理。但是Celery本身不提供队列服务,但是提供了配置项来来实现,一般通过Redis或RabbitMQ实现队列服务。

  • Worker

    字面意思是工人,实际上是执行任务的消费者,它实时监控消息队列,如果有任务就获取任务并执行它。

  • Beat

    定时任务调度器,根据配置定时相关参数将指定的任务按照指定的时间发送给Broker(中间人)。

  • Backend

    用于存储任务的执行结果。可以配置redis或者database作为backend

celery的使用方式

比方说现在站点注册需要在用户注册完成后发送激活邮件给用户,而后台发送邮件时间需要一定时间,而又不能同步等待邮件发送完成再响应页面,这样用户体验非常不好,这个时候我们就需要一个异步框架(celery)来帮我们完成这些任务。

基于命令行下使用(非django环境下)

参考资料

遇到的问题以及解决办法

  • not enough values to unpack (expected 3, got 0)
    win10上更对运行celery4.x就会出现这个问题,需要通过pip install eventlet,同时在启动worker添加一个参数,如:celery -A worker -l info -P eventlet即可
  • 在[tasks]可以看到任务,但是通过调用result.get()提示任务未注册
    这种情况出现的原因可能是你两次执行的导入方式不一样,从而导致自动生成的任务名称不一样,简单的方法就是给任务显式添加任务名可参考该篇文章Celery-4.1 用户指南: Task描述

  • RROR/MainProcess] consumer: Cannot connect to redis
    出现连接不上redis,可以尝试将localhost改成127.0.0.1

  • 无法接收任务,执行不执行,但是celery处于就绪状态
    在视图调用任务时候是否添加了delay()方法

  • 报Object of type ‘byte’ is not JSON serializable
    可以在django的settings.py 里面关于celery的配置参数添加如下内容:
      CELERY_TASK_SERIALIZER = 'pickle'
      CELERY_RESULT_SERIALIZER = 'pickle'
      CELERY_ACCEPT_CONTENT = ['pickle', 'json']
    
    添加pickle,这样的话任务函数如果含有对象参数,执行任务时就不会报对象序列化的问题,关于pickle的具体内容可参考pickle模块详解

发表评论 取消回复

电子邮件地址不会被公开。

请输入以http或https开头的URL,格式如:https://oneisall.top