Django项目使用Celery

·  阅读 73

参考 zhuanlan.zhihu.com/p/162039762 参考 blog.csdn.net/libing_thin…

  1. 安装依赖环境

    pip install redis==3.4.1
    pip install celery==4.4.2
    pip install eventlet # celery 4.0+版本以后不支持在windows运行,还需额外安装eventlet库
    复制代码
  2. 配置setting文件

    # celery相关配置
    # 配置celery时区,默认时UTC。
    timezone = TIME_ZONE
    
    # 任务队列的链接地址 celery配置redis作为broker。redis有16个数据库,编号0~15,这里使用第1个。
    # 先安装redis
    # apt install redis
    # 然后设置密码为 redis
    # redis-cli -h 127.0.0.1
    # config set requirepass jlcssadmin
    
    broker_url = 'redis://:password@127.0.0.1:6379/1'
    
    # 设置存储结果的后台  结果队列的链接地址
    result_backend = 'redis://:password@127.0.0.1:6379/0'
    
    # 可接受的内容格式
    accept_content = ["json"]
    # 任务序列化数据格式
    task_serializer = "json"
    # 结果序列化数据格式
    result_serializer = "json"
    
    # 可选参数:给某个任务限流
    # task_annotations = {'tasks.my_task': {'rate_limit': '10/s'}}
    
    # 可选参数:给任务设置超时时间。超时立即中止worker
    # task_time_limit = 10 * 60
    
    # 可选参数:给任务设置软超时时间,超时抛出Exception
    # task_soft_time_limit = 10 * 60
    
    # 可选参数:如果使用django_celery_beat进行定时任务
    # beat_scheduler = "django_celery_beat.schedulers:DatabaseScheduler"
    
    # 更多选项见
    # https://docs.celeryproject.org/en/stable/userguide/configuration.html
    复制代码
  3. 在settings.py同级目录下新建celery.py,添加如下内容

    from __future__ import absolute_import, unicode_literals
    import os
    from celery import Celery
    from celery.schedules import crontab
    from datetime import timedelta
    from django.conf import settings
    
    # 指定Django默认配置文件模块
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', '项目名 .settings')
    
    # 为我们的项目myproject创建一个Celery实例。这里不指定broker backend 容易出现错误。
    # 如果没有密码 使用 'redis://127.0.0.1:6379/0'
    app = Celery('项目名 ', broker='redis://:password@127.0.0.1:6379/0', backend='redis://:password@127.0.0.1:6379/0')
    
    # 这里指定从django的settings.py里读取celery配置
    app.config_from_object('django.conf:settings')
    # 下面的设置就是关于调度器beat的设置,
    # 具体参考https://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html
    app.conf.beat_schedule = {
        'autosc': {  # 取个名字
            'task': 'user.tasks.auto_sc',  # 设置是要将哪个任务进行定时
            'schedule': crontab(),  # 调用crontab进行具体时间的定义
        },
    }
    # 自动从所有已注册的django app中加载任务
    app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
     
    复制代码
  4. 在settings.py同级目录下的__init__中添加如下内容:

     from __future__ import absolute_import, unicode_literals
     
     # 引入celery实例对象
     from .celery import app as celery_app
     __all__ = ('celery_app',)
    复制代码
  5. 启动redis,测试celery是否配置成功

     # Linux下测试
     # 启动的项目名,而不是应用名
     celery -A myproject worker -l info
     
     # Windows下测试
     celery -A myproject worker -l info -P eventlet
    复制代码

    不报错就是运行成功

     -------------- celery@ubuntu v5.0.5 (singularity)
    --- ***** ----- 
    -- ******* ---- Linux-5.8.0-41-generic-x86_64-with-glibc2.29 2021-02-06 09:53:35
    - *** --- * --- 
    - ** ---------- [config]
    - ** ---------- .> app:         AseetRadar:0x7f1a299a8670
    - ** ---------- .> transport:   redis://:**@127.0.0.1:6379/0
    - ** ---------- .> results:     redis://:**@127.0.0.1:6379/0
    - *** --- * --- .> concurrency: 2 (prefork)
    -- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
    --- ***** ----- 
     -------------- [queues]
                    .> celery           exchange=celery(direct) key=celery
                    
    
    复制代码
  6. 上面2.2中我们已经配置了定时任务,接下来我们要编写定时任务函数,和异步执行函数,在你的app目录下面创建一个tasks.py文件(注意:只能要tasks),内容如下

    from __future__ import absolute_import
    from celery import shared_task
    
    @shared_task
    # 定义的定时任务函数
    def auto_sc():
        print('sc test?')
        return 'halo'
    
    # # name表示设置任务的名称,如果不填写,则默认使用函数名做为任务名
    # 定义的两个异步函数
    @shared_task(name="send_sms")
    def send_sms():
        print("发送短信!!!")
        return "s"
    
    
    @shared_task(name="send_sms2")
    def send_sms2():
        print("发送短信任务2!!!")
        print("p")
        return "p"
    复制代码
  7. app/views.py 内容

    from django.http import JsonResponse
    from . import tasks
    
    
    def deme_view(request):
        # 用delay方法运行函数,这里两个函数可以同时被调用,也就是并行
        result_one = tasks.send_sms.delay()
        result_two = tasks.send_sms2.delay()
    
        # 用get方法拿到返回的结果
        print(result_one.get())
        print(result_two.get())
        final_result = result_one.get() + result_two.get()
    
        return JsonResponse(
            {
                'code': 200,
                'message': 'success',
                'data': {
                    'result': final_result
                }
            }
        )
    复制代码
  8. 启动服务

    # 启动Django 服务
    python manage.py runserver
    
    # Linux下测试
    elery -A 项目名 worker -l info
    
    # win 下启动
    celery -A 项目名 worker -l info -P eventlet  
    
    # 如果有定时任务 还需要启动
    celery -A 项目名 beat -l info
    复制代码
分类:
前端
标签:
收藏成功!
已添加到「」, 点击更改