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

  • 相关阅读:
    Nginx负载均衡+代理+ssl+压力测试
    Nginx配置文件详解
    HDU ACM 1690 Bus System (SPFA)
    HDU ACM 1224 Free DIY Tour (SPFA)
    HDU ACM 1869 六度分离(Floyd)
    HDU ACM 2066 一个人的旅行
    HDU ACM 3790 最短路径问题
    HDU ACM 1879 继续畅通工程
    HDU ACM 1856 More is better(并查集)
    HDU ACM 1325 / POJ 1308 Is It A Tree?
  • 原文地址:https://www.cnblogs.com/chuanxi/p/10314364.html
Copyright © 2011-2022 走看看