环境准备
- python3.5.4
- Windows Redis
- pip install celery
- pip install Redis
Windows 下启动 redirs server
Redis-server.exe Redis.Windows.conf
image.PNG
celery 配置
项目的 settings.py 文件修改:
- # celery 设置
- # celery 中间人 Redis://Redis 服务所在的 ip 地址: 端口 / 数据库号
- BROKER_URL = 'redis://127.0.0.1:6379/0'
- # celery 结果返回, 可用于跟踪结果
- CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/0'
- # celery 内容等消息的格式设置
- CELERY_ACCEPT_CONTENT = ['application/json', ]
- CELERY_TASK_SERIALIZER = 'json'
- CELERY_RESULT_SERIALIZER = 'json'
- # celery 时区设置, 使用 settings 中 TIME_ZONE 同样的时区
- CELERY_TIMEZONE = TIME_ZONE
项目文件夹下添加 celery.py 文件:
- # coding:utf-8
- 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, 网上很多教程这里都是没有设置 broker 造成启动失败
- App = Celery('tasks', broker='redis://127.0.0.1:6379/0')
- # 使用 django 的 settings 文件配置 celery
- App.config_from_object('django.conf:settings')
- # Celery 加载所有注册的应用
- App.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
项目的 init.py 文件修改:
- # 引入 celery 实例对象
- from __future__ import absolute_import, unicode_literals
- from .celery import App as celery_app
- __all__ = ['celery_app]
测试代码
如: 在 app01(项目名)/tasks.py:
关于 task, 并不是一定要把所有的 task 放在 tasks.py, 可以放在其他类里面, 只要在函数上加 @task 即可
- import time
- from celery import task
- @task
- def add(a,b):
- print("这是任务开始")
- print(a+b)
- time.sleep(10)
- print("这是任务结束")
url 配置如下:
path('add', views.add, name="add")
view 代码
- from . import tasks
- def add(request,*args,**kwargs):
- tasks.add.delay(1,2)
- result = {'code': 0, 'msg': '这是一个后台任务'}
- return JsonResponse(result)
再次配置
在 manger.py 目录执行下面的代码, 注意网上的资料大部分执行的命令有问题, 造成启动报错, 比如这个就是错误的,
python manage.py celery -A celery worker --loglevel=info
, 请用下面的命令
celery -A djangoApi worker --pool=solo -l info
启动项目,
python manager.py runserver 0.0.0.0:8081
运行项目
访问 add
image.PNG
查看关键日志
- [tasks]
- . API.base.BaseViewTask.task_run
- . API.tasks.add
- [2019-04-07 13:26:02,855: INFO/MainProcess] Connected to Redis://127.0.0.1:6379/0
- [2019-04-07 13:26:02,869: INFO/MainProcess] mingle: searching for neighbors
- [2019-04-07 13:26:03,911: INFO/MainProcess] mingle: all alone
- [2019-04-07 13:26:03,926: WARNING/MainProcess] e:\App\python35\lib\site-packages\celery\fixups\django.py:202: UserWarning: Using settings.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-04-07 13:26:03,926: INFO/MainProcess] celery@PC-20181208QWQO ready.
- [2019-04-07 13:29:56,889: INFO/MainProcess] Received task: API.tasks.add[9fd98fd0-50ae-427f-8f33-52d1e4b43068]
[2019-04-07 13:29:56,894: WARNING/MainProcess] 这是任务开始
[2019-04-07 13:29:56,895: WARNING/MainProcess] 3
[2019-04-07 13:30:06,896: WARNING/MainProcess] 这是任务结束
[2019-04-07 13:30:06,898: INFO/MainProcess] Task API.tasks.add[9fd98fd0-50ae-427f-8f33-52d1e4b43068] succeeded in 10.0s: None
其他
如何结合前端, 如 Ajax 来联合使用?
表中我加了个 extend 字段, 每次在执行耗时任务后, 页面按钮根据 extend 字段值进行判断
如 1 表示执行中, 0 表示没有执行, 2 执行完成, 来判定按钮是否可以再次点击等
来源: http://www.jianshu.com/p/0fe3479f5f3f