• Django 异步任务、定时任务Celery


    将任务分配给其他的进程去运行,django的主进程只负责发起任务,而执行任务的不在使用django的主进程。Python有一个很棒的异步任务框架,叫做celery

    Django为了让开发者开发更加方便,集成了celery,形成了django-celery插件

    1.安装django-celery

    #Redis模块的兼容不稳定,必须安装2.10.6
    pip install django-celery 
    pip install django-redis 
    pip install redis==2.10.6

    2.安装redis ,解压到指定目录

    Redis-x64-3.2.100.zip 提取码: jmbf 

     

     

    #启动redis
    redis-server.exe redis.windows.conf
    #关闭redis
    redis-cli.exe
    shutdown

    django-celery只是将任务发布出去,让长时间的任务:爬取一个网站,发送一个验证码这样的工作,不再阻塞主线程,web服务器只负责发起任务和接受任务的结果,中间执行的部分交给其他线程、进程、服务器去做。

    Celery异步任务

    1、settings当中配置django-celery

    下面也是settings.py 配置

    # celery 配置
    import djcelery
    
    
    djcelery.setup_loader()# 模块加载
    BROKER_URL = 'redis://127.0.0.1:6379/1' # 任务容器地址,redis数据库地址
    CELERY_IMPORTS = ('CeleryTask.tasks') # 具体任务文件
    CELERY_TIMEZONE = 'Asia/Shanghai' # celery 时区
    CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' # celey处理器,固定

     2.创建使用celeryapp

    python manage.py startapp CeleryTask

    在项目的主目录下,编写celery的控制文件,(控制文件的名字最好是celery)

     celery.py

    import os
    from celery import Celery
    from django.conf import settings
    
    # 设置celery的环境变量和django-celery的工作目录
    os.environ.setdefault("DJANGO_SETTINGS_MODULE","CeleryTask.settings")
    # 实例化celery应用,传入服务器名称
    app = Celery("art_project")
    # 加载celery配置
    app.config_from_object("django.conf:settings")
    
    # 如果在项目中,创建了task.py,那么celery就会沿着app去查找task.py来生成任务
    app.autodiscover_tasks(lambda :settings.INSTALLED_APPS)

    3.新建tasks.pyceleryTask app

     4.编写tasks.py文件

    from __future__ import absolute_import
    from Qshop.celery import app
    
    @app.task
    def add(x,y):
        return x+y

    5.然后为了djcelery进行数据库同步

    python manage.py check
    python manage.py makemigrations
    python manage.py migrate

    6.编写视图触发异步任务

    ursl.py

    urlpatterns = [
    
        path('mtv/', middle_test_view),
    ]

    views.py 

    from CeleryTask.tasks import add
    
    
    def get_task(request):
        num1 = request.GET.get("num1",1)
        num2 = request.GET.get("num2",2)
        add.delay(int(num1),int(num2))
    
        return JsonResponse({"data":"success"})

    7.启动celery worker

    --loglevel=info 指定日志级别

    python manage.py celery worker --loglevel=info

    访问路由查看效果。

    Celery 定时任务

    在settings .py配置

    from celery.schedules import crontab
    from celery.schedules import timedelta
    
    CELERYBEAT_SCHEDULE = {
        u"测试任务":{
            "task":"CeleryTask.tasks.sendDing",
            "schedule":timedelta(seconds=10)
        }
    }

    tasks.py

    @app.task
    def sendDing(content="定时任务执行",to="15037609692"):
        headers = {
            "Content-Type": "application/json",
            "Charset": "utf-8"
        }
        requests_data = {
            "msgtype": "text",
            "text": {
                "content": content
            },
            "at": {
                "atMobiles": [
                ],
                "isAtAll": True
            }
        }
        if to:
            requests_data["at"]["atMobiles"].append(to)
            requests_data["at"]["isAtAll"] = False
        else:
            requests_data["at"]["atMobiles"].clear()
            requests_data["at"]["isAtAll"] = True
        sendData = json.dumps(requests_data)
        response = requests.post(url=DING_URL, headers=headers, data=sendData)
        content = response.json()
        return content

    启动worker

    python manage.py celery worker --loglevel=info

    启动定时任务

    python manage.py celerybeat --loglevel=info

    注意:需要启动的有,django项目,redis数据库,worker,定时任务

  • 相关阅读:
    Apache+PHP配置过程详解以及常见问题
    Apache+php+mysql在windows下的安装与配置图解 写的还不错也算经典新手看看 熟手绕过
    squid和memcache区别
    转 Anaconda启动卡死的解决方案
    转 救命的教程 anaconda下载安装包网络错误的解决办法
    转 Anaconda环境管理
    转: opencv4.0.0 +opencv_contrib在vs2015中编译
    windows下pycharm使用Anaconda安装包环境
    美赛论文写作--写作规范
    Java--对象和引用 转载
  • 原文地址:https://www.cnblogs.com/songdanlee/p/11545601.html
Copyright © 2020-2023  润新知