相关文章推荐
魁梧的小刀  ·  Change this "try" to ...·  1 年前    · 
慷慨大方的酱牛肉  ·  Tkinter ...·  1 年前    · 
想发财的镜子  ·  SQL Server Arithmetic ...·  1 年前    · 

一、Celery介绍

  1. 简介
    Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具。

    它是一个专注于实时处理的任务队列,同时也支持任务调度。

    Celery 有广泛、多样的用户与贡献者社区。

    Celery 是开源的,使用 BSD 许可证 授权。

  2. 优点
    简单:配置项目少,在项目中直接导入使用

    灵活:celery的很多组件都支持灵活拓展

    高可用:当任务执行失败后,它会自动重新执行

    快速:单进程的celery每秒执行上百万个任务

二、Celery配置

因为电脑上有原来安装的 redis 数据库,所以我们使用redis的作为celery任务队列;
传送门:
Windows和Linux(Centos7)下的Redis安装及使用

项目和app创建不过多说明,直接进入主题

  1. 安装依赖包

    pip install celery
    pip install django-celery
    pip install redis
    
  2. settings.py 配置

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

    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)
       

    第一行导入不能换位置,只能在首行,否则会报错

  4. 为方便导入,把实例化celery的app放到 __init__.py 里(settings.py同级目录下的 __init__.py

    from __future__ import absolute_import, unicode_literals
    # 引入celery实例对象
    from .celery import app as celery_app
    
  5. 根目录( manage.py 同级目录)下创建 celery_tasks 目录,然后在 celery_tasks 目录下创建 tasks.py (此文件名必须是 tasks ),并把耗时任务写进去

    from celery_test import celery_app #celery_test为我的项目名
    from app1 import models #app1为我的app名
    import time
    from celery import platforms
    platforms.C_FORCE_ROOT = True
    @celery_app.task
    def login_ip(ip):
        models.Login_ip.objects.create(ip=ip)
        time.sleep(10)
        print('登录ip存储成功')
    
  6. 在view中调用

    from django.shortcuts import render
    from celery_tasks.tasks import login_ip
    # Create your views here.
    def index(request):
        ip = '127.0.0.1'
        login_ip.delay(ip) #异步调用
        return render(request, 'index.html')
       

    注:使用.delay()进行异步调用

  7. 以上配置完成后项目目录结构如下

    ├──celery_test
    	├── celery_test
    	│	├── __init__.py
    	│	├── asgi.py
    	│	├── celery.py
    	│	├── settings.py
    	│	├── urls.py
    	│	└── wsgi.py
    	├── app1
    	│	├── migrations
    	│	├── __init__.py
    	│	├── admin.py
    	│	├── apps.py
    	│	├── models.py
    	│	└── views.py
    	├── celery_tasks
    	│	└── tasks.py
    	├── templates
    	│   └── index.html
    	└── manage.py
    

    三、启动celery

    必须先启动redis服务,安装和简单使用请参考:Windows和Linux(Centos7)下的Redis安装及使用
    方法一:在managy同级文件目录下,输入命令(celery_test为我的项目名):

    celery -A celery_test worker -l info
    

    下列形式说明启动正常

    (venv) F:\celery_test>celery -A celery_test worker -l info
    ......
    DEBUG leads to a memory leak, never use this setting in production environments!
      warnings.warn('Using settings.DEBUG leads to a memory leak, never '
    [2019-12-21 19:14:28,550: WARNING/MainProcess] celery@DESKTOP-ORHB3U3 ready.
    

    方法二:守护进程方式启动,日志记录在celerylog.log里(celery_test为我的项目名):

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

    停止:celery multi stop w1 -A celery_test -l info
    重启:celery multi restart w1 -A celery_test -l info

    启动过程中可能会出现的报错

    四、启动Django项目

    正常启动即可:python manage.py runserver

    如大家发现问题,欢迎留言交流

    对于开发人员,尤其要注重用户体验,毕竟没有用户使用,那么开发将毫无意义。Celery异步处理框架,可用于执行耗时任务,比如发送邮件、文件上传,图像处理等等比较耗时的操作,这样用户不需要等待很久,可大大提高用户体验。
    django-celery-transactions django-celery-transactions保留Celery任务,直到提交了当前数据库事务为止,避免了Celery 所述的潜在竞争情况。 从信号处理程序发送任务,不用担心! 如果回滚事务,则将丢弃任务。 如果引发异常,则Django的事务中间件将执行此操作。 如果不管理事务,则正常发送任务。 这意味着从Django的外壳中发送任务将按预期工作,各种事务装饰器commit_manually , commit_on_success等也将正常工作。 安装及使用 从PyPI安装django-celery-transactions: $ pip install django-celery-transactions 使用修补的装饰器创建任务: from djcelery_transactions import task 将浏览器打开到来查看应用程序,或者打开浏览器到 来查看Flower仪表板。 触发新任务: $ curl -F type=0 http://localhost:1337/tasks/ 检查状态: $ curl http://localhost:1337/tasks/ < TASK> /
    在运营系统中经常用到异步方式来处理我们的任务,比如将业务上线流程串成任务再写入队列,通过后台作业节点去调度执行。比较典型的案例为腾讯的蓝鲸、织云、云智慧等平台。本译文结合Django+Celery+Redis实现一个定期从Flickr获取图片并展示的简单案例,方便大家理解实现异步对列任务的过程。刚接触django的时候,我经历过的最让人沮丧的事情是需要定期运行一段代码。我写了一个需要每天上午12点执行一个动作的不错的函数。很简单是不是?错了。事实证明,这对我来说是一个巨大的困难点,因为,那时我使用Cpane类型的虚拟主机管理系统,它能专门提供一个很友好,很方便的图形用户界面来设置cron作业。
    Django 的测试守护程序。 基于 将尝试找到进行更改的应用程序并仅为该应用程序运行测试。 如果找不到它或影响整个项目的更改,则将运行所有测试。 它不会注意到来自其他应用程序的测试使用已更改的应用程序。 即:更改应用程序帐户,但来自银行应用程序的测试使用帐户。 只会运行帐户测试。 git clone 这个仓库然后: pip install -e . 来自激活的 virtualenv。 Usage: Usage: %[prog] [options] [<path>] -h, --help show this help message and exit -s SETTINGS, --settings=SETTINGS Django settings module i
    Celery文档参考:http://docs.jinkan.org/docs/celery/ 参考文章:https://www.jb51.net/article/158046.htm Django中异步任务django-celery Celery简单介绍: celery使用场景: 耗时任务定时任务 请求结果不怎么重要的 耗时任务比如:发送短信验证码我们可以先发送给客户任务状态(请求成功或失败) 请求结果重要的建议使用django实现 比如:支付 首先简单介绍一下,Celery 是一个强大的分布式任务队列,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行。我们通
    在使用django在web项目开发中避免不了会进行性能优化,最近特意总结了一些我用到过的性能优化方法。都是实际开发过程中非常有用的技巧,希望能够对大家有所帮助。 1.性能分析工具 cprofile from cProfile import Profile import pstats prof = Profile() prof.enable() # 运行函数 run_func() prof.create_stats() p = pstats.Stats(prof) p.print_callees() 通用的初始化脚本  脚本代码:extra/generic-init.d/  这个目录包含了celery worker程序通用的初始化脚本,这些脚本应该运行在Linux,FreeBSD,OpenBSD和其它类UNIX平台。 初始化脚本:celeryd 使用方法:/etc/init.d/celeryd {start|s
    top命令下,M键开启按MEM列排序的进程列表,按H则查看线程列表,由于worker没有子线程,所以只显示一条记录; 按c命令,开始COMMAND列详细情况,可以找到对应的进程启动者; 按o键,开启筛选功能,输入COMMAND=celery只显示celery... 'allauth.socialaccount', 'allauth.socialaccount.providers.google', 'allauth.socialaccount.providers.facebook', SOCIALACCOUNT_PROVIDERS = { 'google': { 'SCOPE': [ 'profile', 'email', 'AUTH_PARAMS': { 'access_type': 'online', 'facebook': { 'METHOD': 'oauth2', 'SCOPE': ['email', 'public_profile'], 'AUTH_PARAMS': {'auth_type': 'reauthenticate'}, 'FIELDS': [ 'id', 'email', 'name', 'first_name', 'last_name', 'verified', 'locale', 'timezone', 'link', 'gender', 'updated_time', 'EXCHANGE_TOKEN': True, 'LOCALE_FUNC': lambda request: 'en_US', 'VERIFIED_EMAIL': False, 'VERSION': 'v2.12', 3. 在 Django 的 urls.py 文件中添加 allauth 的 URL 路径: ```python urlpatterns = [ path('accounts/', include('allauth.urls')), 4. 在 Django 的 templates 目录中创建一个 base.html 文件,并在该文件中添加登录/注册的链接: ```html {% if user.is_authenticated %} <a href="{% url 'account_logout' %}">Logout</a> {% else %} <a href="{% url 'account_login' %}">Login</a> <a href="{% url 'account_signup' %}">Signup</a> {% endif %} 报错(/etc/init.d/redisd: line 28: /usr/local/bin/redis-server: No such file or directory)的解决办法 17209