博客
关于我
Django 3.0.1 + celery 4.4.2 + redis 部署
阅读量:662 次
发布时间:2019-03-15

本文共 2413 字,大约阅读时间需要 8 分钟。

Celery在Django项目中的配置与部署

一、背景

Celery是Django中常用的任务队列系统,能够帮助开发者轻松实现异步任务处理。根据文档,Celery 4.0要求Django 1.8或更高版本。如果你的Django版本低于1.8,则需要使用Celery 3.1。

安装三个包:celery、celery-with-redis、django-celery。安装时发现celery-with-redis和django-celery支持的Celery版本最高到4.0。这意味着最新版本的Celery已经实现了这两个包的功能,因此不需要安装这两个包。

二、部署步骤

  • 项目目录结构
  • proj/├── manage.py├── __init__.py├── settings.py├── urls.py└── app1/    ├── __init__.py    ├── admin.py    ├── app1.py    ├── models.py    ├── tests.py    └── urls.py        └── views.py
    1. 创建celery.py
    2. 在proj/目录下创建celery.py:

      from __future__ import absolute_import, unicode_literalsimport osos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')app = Celery('proj')app.config_from_object('django.conf:settings', namespace='CELERY')app.autodiscover_tasks()@app.task(bind=True)def debug_task(self):    print('Request: {0!r}'.format(self.request))
      1. 在proj/init.py中导入Celery
      2. from __future__ import absolute_import, unicode_literalsfrom .celery import app as celery_app__all__ = ('celery_app',)
        1. 在settings.py中添加配置
        2. CELERY_BROKER_URL = 'redis://root:password@127.0.0.1:6379/0'
          1. 编写Task代码
          2. 在proj/app1/tasks.py中:

            from __future__ import absolute_import, unicode_literalsfrom celery import shared_taskfrom demoapp.models import Widget@shared_taskdef add(x, y):    return x + y@shared_taskdef mul(x, y):    return x * y@shared_taskdef xsum(numbers):    return sum(numbers)import time@shared_taskdef count_widgets():    time.sleep(5)    return Widget.objects.count()@shared_taskdef rename_widget(widget_id, name):    w = Widget.objects.get(id=widget_id)    w.name = name    w.save()
            1. 启动命令
            2. 在命令行窗口中:

              # 启动Celery Workercelery -A proj worker -l info -P eventlet# 启动Django服务器python manage.py runserver
              1. 在views.py中使用Task
              2. 在proj/app1/views.py中:

                from .task import count_widgetsdef celery(request):    res = count_widgets.delay()    return render(request, 'app1/celery.html')

                三、问题解决

              3. 版本问题
              4. 只需安装celery一个包即可。如果Django低于1.8版本,请使用Celery 3.1。

                1. 错误:Celery ValueError: not enough values to unpack (expected 3, got 0)
                2. 解决方法:

                  pip install eventletcelery -A proj worker -l info -P eventlet

                  参数说明:

                  • -A proj:指定项目名
                  • -P eventlet:使用eventlet池
                  • -l info:日志级别
                  1. 错误:DatabaseError: DatabaseWrapper objects created in a thread can only be used in that same thread
                  2. 解决方法:

                    在PyCharm中搜索monkey_patch()函数,修改如下:

                    def get_ident(gr=None):    if gr is None:        return id(greenlet.getcurrent())    else:        return id(gr)

                    修改后,monkey_patch() 不再对thread进行打补丁。

                    四、参考资料

    转载地址:http://xnglz.baihongyu.com/

    你可能感兴趣的文章
    PBT
    查看>>
    PB级分析型数据库ClickHouse的应用场景和特性
    查看>>
    pc3-12800
    查看>>
    PCA---主成成分分析
    查看>>
    PCA和自动编码器:每个人都能理解的算法
    查看>>
    pca算法
    查看>>
    PCA降维demo
    查看>>
    SharePoint 2013 图文开发系列之定义站点模板
    查看>>
    PCB生产流程详解-ChatGPT4o作答
    查看>>
    PCB设计十条黄金法则
    查看>>
    SpringSecurity框架介绍
    查看>>
    PCI Express学习篇:Power Management(二)
    查看>>
    pcie握手机制_【博文连载】PCIe扫盲——Ack/Nak 机制详解(一)
    查看>>
    pcm转wav的方法及代码示例
    查看>>
    PC史上最悲剧的16次失败
    查看>>
    PC端恶意代码分析Lab1.1-5.1,从零基础到精通,收藏这篇就够了!
    查看>>
    PC端稳定性测试探索
    查看>>
    PC端编辑 但能在PC端模拟移动端预览的富文本编辑器
    查看>>
    PDB文件:每个开发人员都必须知道的
    查看>>
    springMVC学习(二)
    查看>>