django celery 异步任务处理、定时任务、踩坑文

django celery 异步任务处理、定时任务、踩坑文

    • 概述
    • [几乎的完整源代码 点我](https://github.com/HxBreak/django-asynctask/)
    • 就这样,祝大家元旦学习愉快

概述

最近有这样一个任务,后端需要去其他远程数据源获取大量数据,然后存储到本地供其他程序使用,需要提供一个web页面,监视任务状态,供小白操作,没有其他任何限制

(两个小时候)写文章太费力气了,于是只写了比较麻烦的地方和一些心柔容易疑惑的地方,详细入门请参考其他文章或者页面下方源代码,本文只对部分常用的功能做介绍

我先选择了python的django作为web基础框架,紧接着异步任务这块本来自己写了个简易的线程池,偶然看到了celery,仔细观摩之后准备使用celery,因为celery强大,万一功能需要扩展又能省下不少力气。

依赖(接下来会使用到)
django, django-redis(几乎没什么用)
celery, redis(数据存储), flower(任务的状态的持续追踪)
详细参照工程目录的依赖文件 1
  1. 配置数据库 源代码

    CELERY_BROKER_URL = CELERY_BROKER_URL
    CELERY_RESULT_BACKEND = CELERY_RESULT_BACKEND
    CELERY_ACCEPT_CONTENT = [‘pickle’]
    CELERY_RESULT_SERIALIZER = ‘pickle’
    CELERY_TASK_SERIALIZER = ‘pickle’
    CELERY_TASK_TRACK_STARTED = True

    吧啦吧啦,中间的太简单直接看源码就可以
    跳到一些关键位置

  2. 划重点Task的实例化,Task函数中如果有需要初始化的数据,假如所有的过程都需要一个对象,但是不想每次都在过程中初始化,可以通过继承Task类来完成,(Task并不会多次被实例化,有需要和其他任务不一样的,可以通过重写Task类给shared_task指定不一样的base来实现)

    from celery import shared_task, Task
    
    class TaskCustom(Task):
        def __init__(self):
            self.a = ['custom init']	
    
    @shared_task(base=TaskCustom)
    def add(x, y):
        return {'sum': x+y, 'if': add.a}#用法函数名.属性
    
  3. flower的使用(暂时没有发现其他方法,如有发现请私信我[email protected])
    flower是用来监视队列和Worker的一个工具,可以直接访问端口来查看flower提供的页面,也可以选择使用flower api来实现自己的页面,详细接口页面

  4. 划重点生成任务之后有可能会在任务还没有加入队列的时候向flower请求任务状态,会产生404错误,解决方案有两个,

    1. 服务端在delay(xxx)之后sleep 0.5s(甚至更短)
    2. 在新的页面提示用户刷新,不丢出404错误

几乎的完整源代码 点我

下载项目后需要在asynctask目录创建自己的db_config.py 文件
内容样板如下


CELERY_BROKER_URL = '协议://用户:密码@IP:端口/数据库'
CELERY_RESULT_BACKEND = '协议://用户:密码@IP:端口/数据库'

brokerUrl暂时只支持部分数据库,下面给出部分配置链接
如果brokerUrl是Redis数据库resultBackend也可以设置为相同的配置

最新源代码已加入定时任务的demo

使用 RabbitMQ
使用 Redis

就这样,祝大家元旦学习愉快

你可能感兴趣的:(python,web,异步任务处理,celery)