本文共 2413 字,大约阅读时间需要 8 分钟。
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
在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)) from __future__ import absolute_import, unicode_literalsfrom .celery import app as celery_app__all__ = ('celery_app',) CELERY_BROKER_URL = 'redis://root:password@127.0.0.1:6379/0'
在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()
在命令行窗口中:
# 启动Celery Workercelery -A proj worker -l info -P eventlet# 启动Django服务器python manage.py runserver
在proj/app1/views.py中:
from .task import count_widgetsdef celery(request): res = count_widgets.delay() return render(request, 'app1/celery.html')
只需安装celery一个包即可。如果Django低于1.8版本,请使用Celery 3.1。
解决方法:
pip install eventletcelery -A proj worker -l info -P eventlet
参数说明:
-A proj:指定项目名-P eventlet:使用eventlet池-l info:日志级别解决方法:
在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/