• celey异步任务


    参考:http://yshblog.com/blog/163
    """
    需安装软件:
    pip install celery
    sudo apt-get install redis-server
    一、Django加入Celery

    现打开首页要执行一个收集访客数据,发送邮件等操作。这是一个耗时任务,若放在home处理方法中执行,用户打开首页会很慢。用户体验不好,很可能不会等到页面打开。
    通常这个耗时任务可以多线程处理或者异步处理。我们模拟一个耗时任务,丢给Celery异步处理。
    先模拟耗时任务,打开views.py,修改如下:
    #coding:utf-8
    from django.shortcuts import render
    from django.http import HttpResponse
     
    from .models import Blog
    import json
    import time
     
    def sendmail(email):
        print('start send email to %s' % email)
        time.sleep(5) #休息5秒
        print('success')
        return True
     
    def home(request):
        #耗时任务,发送邮件
        sendmail('test@test.com')
     
        #其他行为
        data = list(Blog.objects.values('caption'))
        return HttpResponse(json.dumps(data), content_type = 'application/json')
    """
    二、在settings.py同级目录添加celery.py
    #coding:utf-8
    from __future__ import absolute_import, unicode_literals
     
    from celery import Celery
    from django.conf import settings
    import os
     
     
    #设置环境变量
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test_django.settings')
    
     
    #实例化Celery
    app = Celery('test_django')
     
    #使用django的settings文件配置celery
    app.config_from_object('django.conf:settings')
     
    #Celery加载所有注册的应用
    app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
    
    三、这个文件还没被加载,接着打开settings.py同个目录下的__init__.py文件。让运行该Django项目的时候,加载该文件配置Celery。修改代码如下:
    #coding:utf-8
    from __future__ import absolute_import, unicode_literals
     
    #引入celery实例对象
    from .celery import app as celery_app
    
    四、
    还需在settings.py中设置celery,尤其是中间人的设置。若不设置中间人,会提示无法连接中间人的错误。在settings.py文件中添加如下设置:
    #celery settings
    #celery中间人 redis://redis服务所在的ip地址:端口/数据库号
    BROKER_URL = 'redis://localhost:6379/0'
    #celery结果返回,可用于跟踪结果
    CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
     
    #celery内容等消息的格式设置
    CELERY_ACCEPT_CONTENT = ['application/json',]
    CELERY_TASK_SERIALIZER = 'json'
    CELERY_RESULT_SERIALIZER = 'json'
     
    #celery时区设置,使用settings中TIME_ZONE同样的时区
    CELERY_TIMEZONE = TIME_ZONE
    
    五、4、把耗时任务丢给celery处理
    
    上面views.py中有个耗时任务sendmail。在myapp应用中新建文件tasks.py,将sendmail方法剪切到该文件中并用定义为celery任务。tasks.py文件如下代码:
    #coding:utf-8
    from celery.decorators import task 
    import time
     
    @task
    def sendmail(email):
        print('start send email to %s' % email)
        time.sleep(5) #休息5秒
        print('success')
        return True
    
    在原有的方法上加上celery装饰器task。或者也可以通过前面添加的celery_app给sendmail方法加装饰器:
    #coding:utf-8
    #myproject是当前django的项目名
    from myproject import celery_app
    import time
     
    @celery_app.task
    def sendmail(email):
        print('start send email to %s' % email)
        time.sleep(5) #休息5秒
        print('success')
        return True
     
    另外原先的views.py修改如下:
    #coding:utf-8
    from django.shortcuts import render
    from django.http import HttpResponse
     
    from .models import Blog
    from .tasks import sendmail #引用tasks.py文件的中sendmail方法
    import json
     
    def home(request):
        #耗时任务,发送邮件(用delay执行方法)
        sendmail.delay('test@test.com')
     
        #其他行为
        data = list(Blog.objects.values('caption'))
        return HttpResponse(json.dumps(data), content_type = 'application/json')
    
    接着,启动celery worker。这个worker是用于异步执行任务的“工作者”。进入manage.py文件所在的目录,执行如下命令:
    celery -A myproject worker -l info
    或者celery -A myproject worker -l debug
  • 相关阅读:
    浅谈Tarjan算法及思想
    浅谈前向星
    线段树初步
    树状数组的简单运用
    字典树(trie树)的指针简单实现pascal
    排序专辑
    POJ 2155 Matrix (矩形)
    区间动态规划
    hdu-2795 Billboard---线段树
    hdu-1754 I Hate It---线段树模板题
  • 原文地址:https://www.cnblogs.com/lajiao/p/9182874.html
Copyright © 2020-2023  润新知