博客
关于我
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/

    你可能感兴趣的文章
    Python-Pandas-将特定函数应用于给定级别-多索引数据框架
    查看>>
    python-queue队列通信
    查看>>
    python-ros No module named PyKDL
    查看>>
    python-social-auth 是否需要会话
    查看>>
    Python再获年度编程语言,微软或成最大赢家
    查看>>
    python-week5
    查看>>
    Python写表情包搜索工具(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    Python-【1】配置
    查看>>
    Python-从子文件夹执行绝对导入
    查看>>
    Python-刷新页面,直到元素可单击
    查看>>
    PYTHON-唤醒+VOSK+DEEPSEEK+离线合成-实现纯离线大模型问答
    查看>>
    Python-在Dash回调中重用函数
    查看>>
    PYTHON-基本数据类型-元祖类型,字典类型,集合类型
    查看>>
    python-外观模式
    查看>>
    Python-如何使用FastAPI和uvicorn.run而不阻塞线程?
    查看>>
    Python-字典
    查看>>
    python-字符串
    查看>>
    Python-将二进制遮罩转换为多边形
    查看>>
    python-文件操作
    查看>>