zoukankan      html  css  js  c++  java
  • celery的具体应用

    因为superviser不支持python3,而网上关于celery后台运行的说明大都使用superviser,所以对于python3用户celery后台运行便成为了一个问题。再没废话,直接上代码。

    环境说明:

             python3.6

             django2.0.5

             我们使用redis的作为celery任务队列,有一个合成包可以直接安装两者一起使用需要的安装包

             直接在终端键入

    pip install celery-with-redis
             就可以安装需要的依赖包了      

            构建项目过程略过,直接开始进行celery配置

    一、celery配置。

            我们的项目名称为myproject,首先setting配置,添加

    # celery settings
    # celery中间人 redis://redis服务所在的ip地址:端口/数据库号
    BROKER_URL = 'redis://localhost:6379/3'
    # celery结果返回,可用于跟踪结果
    CELERY_RESULT_BACKEND = 'redis://localhost:6379/3'
    
    # celery内容等消息的格式设置
    CELERY_ACCEPT_CONTENT = ['application/json', ]
    CELERY_TASK_SERIALIZER = 'json'
    CELERY_RESULT_SERIALIZER = 'json'
    
    # celery时区设置,使用settings中TIME_ZONE同样的时区
    CELERY_TIMEZONE = TIME_ZONE

    然后在PATH/myproject/myproject/即setting的同级目录下创建celery.py,初始化celery。

    from __future__ import absolute_import, unicode_literals
    
    from celery import Celery
    from django.conf import settings
    import os
    
    # 获取当前文件夹名,即为该Django的项目名
    project_name = os.path.split(os.path.abspath('.'))[-1]
    project_settings = '%s.settings' % project_name
    
    # 设置环境变量
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', project_settings)
    
    # 实例化Celery
    app = Celery(project_name)
    
    # 使用django的settings文件配置celery
    app.config_from_object('django.conf:settings')
    
    # Celery加载所有注册的应用
    app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
    #Celery加载所有注册的应用
    app.autodiscover_tasks(lambda:settings.INSTALLED_APPS)

    这里第一行输入不能换位置,只能在首行,否则会报错。

    这里的实例化celery的app我们在别处要导入,为了方便导入,我们把它放到__init__.py里,所以在/myproject/myproject/__init__.py我们加入

    from __future__ import absolute_import, unicode_literals
    
    # 引入celery实例对象
    from .celery import app as celery_app

    这样同时也能告知django celery.py文件的存在。

    二、用celery装饰我们的需要进行的异步函数。
    我们在项目根目录下创建celery_tasks模块,即在PATH/myproject/下创建该模块,然后在该模块下创建tasks.py,把我们的耗时程序写进去。

    from myproject import celery_app
    import time
    
    @celery_app.task
    def time_consuming_fun():
        for i in range(5):
            time.sleep(1)
            print(i)
        return 'ok'

    直接用我们的celery_app下的task方法装饰需要进行异步处理的函数即可。

    三、调用异步函数。
    在view中调用,这里用的是Django的类视图。

    from celery_tasks.tasks import time_consuming_fun
    from django.views import View
    from django.http import JsonResponse
    
    # Create your views here.
    
    class MyView(View):
    def get(self,request):
    #异步调用
    time_consuming_fun.delay()
    #直接调用
    #time_consuming_fun()
    return JsonResponse({'msg':'ok','code':200})


    配置好url即可。

    四、启动celery。
    在项目根目录下,即managy同级文件目录下,输入命令:

    celery -A myproject worker -l info


    此时celery在终端窗口运行,关闭终端celery就会停止。

    输入命令

    celery multi start w1 -A myproject -l info --logfile = celerylog.log --pidfile = celerypid.pid


    此时celery为守护进程,日志记录在celerylog.log里。

    日志文件可以指定路径PATH/celerylog.log,此时会在指定路径下创建日志文件。进程号文件类似。

    停止或重启将开始换为stop或restart即可,所以需记录w1,即需记录woker的名称来方便重启和停止。
    ---------------------
    参考:

    https://blog.csdn.net/Callme_My_Yang/article/details/80882866

  • 相关阅读:
    《构建之法》第四章学习笔记
    《深入理解计算机系统》第四章学习笔记
    《构建之法》第三章学习笔记
    《深入理解计算机系统》第三章学习笔记
    《文献管理与信息分析》第二讲学习笔记
    《深入理解计算机系统》第二章学习笔记
    20179223《Linux内核原理与分析》第十二周学习笔记
    《从问题到程序》第三章学习笔记
    51nod1256乘法逆元
    51nod1212无向图最小生成树
  • 原文地址:https://www.cnblogs.com/chuanxi/p/10314364.html
Copyright © 2011-2022 走看看