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

    你可能感兴趣的文章
    Node.js 切近实战(七) 之Excel在线(文件&文件组)
    查看>>
    node.js 初体验
    查看>>
    Node.js 历史
    查看>>
    Node.js 在个推的微服务实践:基于容器的一站式命令行工具链
    查看>>
    Node.js 实现类似于.php,.jsp的服务器页面技术,自动路由
    查看>>
    Node.js 异步模式浅析
    查看>>
    node.js 怎么新建一个站点端口
    查看>>
    Node.js 文件系统的各种用法和常见场景
    查看>>
    Node.js 模块系统的原理、使用方式和一些常见的应用场景
    查看>>
    Node.js 的事件循环(Event Loop)详解
    查看>>
    node.js 简易聊天室
    查看>>
    Node.js 线程你理解的可能是错的
    查看>>
    Node.js 调用微信公众号 API 添加自定义菜单报错的解决方法
    查看>>
    node.js 配置首页打开页面
    查看>>
    node.js+react写的一个登录注册 demo测试
    查看>>
    Node.js中环境变量process.env详解
    查看>>
    Node.js之async_hooks
    查看>>
    Node.js初体验
    查看>>
    Node.js升级工具n
    查看>>
    Node.js卸载超详细步骤(附图文讲解)
    查看>>