0、目的
在开发项目中,经常有一些操作时间比较长(生产环境中超过了nginx的timeout时间),或者是间隔一段时间就要执行的任务。
在这种情况下,使用celery就是一个很好的选择。
celery是一个异步任务队列/基于分布式消息传递的作业队列。
Celery通过消息(message)进行通信,使用代理(broker)在客户端和工作执行者之间进行交互。
当开始一个任务时,客户端发送消息到队列并由代理将其发往响应的工作执行者处。
准备使用redis作为消息代理(broker),Django数据库作为结果存储(ResultStore)。
1、安装
redis:
windows:
linux:
yum install redis-server
PS:需要在cmd中运行,不能再powercmd。很奇怪。
pip install celery
pip install celery-with-redis
pip install django-celery
2、django代码(whthas_home为project,portal为app)
修改代码,whthas_home/__init__.py
1 from __future__ import absolute_import
2
3 from .celery import app as celery_app
修改代码,whthas_home/setting.py
1 # Celery settings
2 import djcelery
3 djcelery.setup_loader()
4
5 BROKER_URL = 'redis://127.0.0.1:6379/0'
6 CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/0'##加密方式CELERY_RESULT_BACKEND = 'redis://:密码@127.0.0.1:6379/0'
7 CELERY_ACCEPT_CONTENT = ['json']
8 CELERY_TASK_SERIALIZER = 'json'
9 CELERY_RESULT_SERIALIZER = 'json'
10 CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
11 CELERY_TIMEZONE = 'Asia/Shanghai'
12
13 # Application definition
14
15 INSTALLED_APPS = [
16 'django.contrib.auth',
17 'django.contrib.contenttypes',
18 'django.contrib.sessions',
19 'django.contrib.messages',
20 'django.contrib.staticfiles',
21 'suit',
22 'django.contrib.admin',
23 'DjangoUeditor',
24 'portal',
25 'djcelery',
26 ]
增加文件, whthas_home/celery.py
1 from __future__ import absolute_import
2
3 import os
4 from celery import Celery
5 from django.conf import settings
6
7 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'whthas_home.settings')
8
9 app = Celery('portal')
10
11 app.config_from_object('django.conf:settings')
12 app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
13
14
15 @app.task(bind=True)
16 def debug_task(self):
17 print('Request: {0!r}'.format(self.request))
增加文件,portal/tasks.py
1 from celery import task
2 from time import sleep
3
4
5 @task()
6 def Task_A(message):
7 Task_A.update_state(state='PROGRESS', meta={'progress': 0})
8 sleep(10)
9 Task_A.update_state(state='PROGRESS', meta={'progress': 30})
10 sleep(10)
11 return message
12
13
14 def get_task_status(task_id):
15 task = Task_A.AsyncResult(task_id)
16
17 status = task.state
18 progress = 0
19
20 if status == u'SUCCESS':
21 progress = 100
22 elif status == u'FAILURE':
23 progress = 0
24 elif status == 'PROGRESS':
25 progress = task.info['progress']
26
27 return {'status': status, 'progress': progress}
3、测试
启动broker:python manage.py celeryd -l info
进入shell:python manage.py shell,测试程序是否正常。
>>> from portal.tasks import *
>>> t = TaskA.delay("heel2")
>>> get_task_status(t.id)
{'status': u'PROGRESS', 'progress': 0}
>>> get_task_status(t.id)
{'status': u'PROGRESS', 'progress': 0}
>>> get_task_status(t.id)
{'status': u'PROGRESS', 'progress': 30}
>>> get_task_status(t.id)
{'status': u'PROGRESS', 'progress': 30}
>>> get_task_status(t.id)
{'status': u'SUCCESS', 'progress': 100}
>>>
同时broker侧能看到:
[2017-04-21 16:38:47,023: INFO/MainProcess] Received task: portal.tasks.Task_A[da948495-c64b-4ff9-882b-876721cd5017]
[2017-04-21 16:39:07,035: INFO/MainProcess] Task portal.tasks.Task_A[da948495-c64b-4ff9-882b-876721cd5017] succeeded in 20.0099999905s: heel
表示代码能正常运行。
使用redis-client看到任务状态:
127.0.0.1:6379> get "celery-task-meta-da948495-c64b-4ff9-882b-876721cd5017"
"{\"status\": \"SUCCESS\", \"traceback\": null, \"result\": \"heel\", \"children\": []}"
相关redis命令:keys *
4、django后台定义任务
进入后台
设置任务
5、执行任务
启动broker:python manage.py celeryd -l info
因为这里是个定时任务,所以还需要启动心跳 :python manage.py celery beat
[2017-04-21 16:56:33,216: INFO/MainProcess] Received task: portal.tasks.Task_A[d8a26977-8413-4bf0-b518-b53052af4cee]
[2017-04-21 16:56:53,211: INFO/MainProcess] Received task: portal.tasks.Task_A[00f1cab7-eb56-4cc3-9979-a8a68aaaf2de]
[2017-04-21 16:56:53,220: INFO/MainProcess] Task portal.tasks.Task_A[d8a26977-8413-4bf0-b518-b53052af4cee] succeeded in 20.003000021s: heel2
[2017-04-21 16:57:13,211: INFO/MainProcess] Received task: portal.tasks.Task_A[aa652612-8525-4110-94ea-9010085ec20b]
[2017-04-21 16:57:13,223: INFO/MainProcess] Task portal.tasks.Task_A[00f1cab7-eb56-4cc3-9979-a8a68aaaf2de] succeeded in 20.0080001354s: heel2
[2017-04-21 16:57:33,213: INFO/MainProcess] Received task: portal.tasks.Task_A[9876890e-6a71-4501-bdae-775492ebae88]
[2017-04-21 16:57:33,219: INFO/MainProcess] Task portal.tasks.Task_A[aa652612-8525-4110-94ea-9010085ec20b] succeeded in 20.0050001144s: heel2
[2017-04-21 16:57:53,211: INFO/MainProcess] Received task: portal.tasks.Task_A[c12fcffc-3910-4a22-93b3-0df740910728]
[2017-04-21 16:57:53,221: INFO/MainProcess] Task portal.tasks.Task_A[9876890e-6a71-4501-bdae-775492ebae88] succeeded in 20.0069999695s: heel2
[2017-04-21 16:58:13,211: INFO/MainProcess] Received task: portal.tasks.Task_A[ccfad575-c0b4-48f5-9385-85ff5dac76fc]
[2017-04-21 16:58:13,217: INFO/MainProcess] Task portal.tasks.Task_A[c12fcffc-3910-4a22-93b3-0df740910728] succeeded in 20.003000021s: heel2
[2017-04-21 16:58:33,211: INFO/MainProcess] Received task: portal.tasks.Task_A[0d6f77a6-a29c-4ead-9428-e3e758c754e1]
[2017-04-21 16:58:33,221: INFO/MainProcess] Task portal.tasks.Task_A[ccfad575-c0b4-48f5-9385-85ff5dac76fc] succeeded in 20.007999897s: heel2
[2017-04-21 16:58:53,211: INFO/MainProcess] Received task: portal.tasks.Task_A[34b2b3a0-771c-4a28-94a1-92e25763fae1]
[2017-04-21 16:58:53,217: INFO/MainProcess] Task portal.tasks.Task_A[0d6f77a6-a29c-4ead-9428-e3e758c754e1] succeeded in 20.0039999485s: heel2
[2017-04-21 16:59:13,211: INFO/MainProcess] Received task: portal.tasks.Task_A[d4be920f-376a-46a2-9edd-095234d29ef2]
[2017-04-21 16:59:13,217: INFO/MainProcess] Task portal.tasks.Task_A[34b2b3a0-771c-4a28-94a1-92e25763fae1] succeeded in 20.0039999485s: heel2
可见:设置定时任务成功。
参考资料:
3、https://my.oschina.net/kinegratii/blog/292395?fromerr=2lvw3H0L,djcelery入门:实现运行定时任务
分享到:
相关推荐
通过以上步骤,我们成功实现了 Django 项目与 Celery 的整合,能够有效地利用 Celery 进行异步任务处理。对于更高级的应用场景,比如复杂的定时任务管理,还可以进一步探索和使用 Celery Beat 来实现。 此外,如果...
【标题】"django+celery+redis+supervisor教程代码" 涉及到的知识点主要集中在构建分布式任务调度和管理的系统上。这个教程旨在教你如何使用Django作为Web框架,Celery作为异步任务队列,Redis作为消息中间件,以及...
Python + Django + MySQL + Redis + Celery 注:后台管理系统直接使用Django的admin实现 关于版本 Python 3.6 Django 2.2.12 MySQL 8.0.12 Celery 4.3.0 Redis 3.2.1 系统主要模块及实现功能 本系统分为了五个模块...
本项目是本人学习django+celery+redis+docker实战的项目。
在本文中,我们将深入探讨如何使用Django与Celery框架实现动态配置定时任务。Django是一个流行的Python web框架,而Celery则是一个分布式任务队列,适用于处理异步任务和定时任务。结合两者,我们可以创建一个强大的...
本项目“基于Django+Celery队列实现的集中化异步任务调度系统”旨在提供一个易于集成的框架,帮助开发者快速在Django项目中实现异步任务处理,降低业务代码的复杂性。 Django是Python领域广泛使用的Web框架,以其...
在这个【django-celery-redis-simple-master】项目中,你将找到上述步骤的具体实现,包括配置文件、任务定义和如何在Django应用中使用这些任务。通过阅读和运行这个项目,你不仅可以了解Celery和Redis的基本用法,还...
开发环境: Pycharm + Python3.6 + Django2.0 + mysql数据库,redis数据库 毕业设计-中国知网(cnki)爬虫及数据可视化,采用Django和Celery将爬虫内置在网站内,展示实时爬取的数据,数据结果通过Highcharts图表展示...
一、背景 (1)Celery 4.0要求Django1.8或者比1.8 更新的版本,如果Django低于1.8...也就是最新版本的Celery已经实现了 celery-with-redis、django-celery包的功能,不在需要安装这两个包。 ERROR: django-celery 3
标题和描述中提到的知识点主要涉及Django、Celery以及Redis在部署定时任务方面的应用,重点是如何使用这些工具实现多worker和多队列机制。以下是详细的知识点说明。 首先,Celery是一个基于消息队列的异步任务队列/...
基于Python+Django+Redis+Mysql的B2C生鲜商城源码+项目说明+项目截图.zip 【项目介绍】 基于B2C的商业模式的设计思路的天天生鲜商城,以其完整的功能,为用户提供一个完整的购物支付环境 技术栈 基于Python3.6和...
1.此扫描器基于Python3.8.0和Django2.2开发,是一款全开源的漏洞扫描器,借助Celery插件实现了异步的端口扫描和后台扫描,而漏洞扫描则使用了著名漏洞扫描工具AWVS的API实现。 2.本项目的前端界面在开源项目H+的基础...
Django实战:Django 3.0 + Redis 3.4 + Celery 4.4异步生成静态HTML文件(附源码) 作者: 大江狗 微信公众号:【Python Web与Django开发】 项目描述 创建两个页面,一个用于创建页面,一个用于动态展示页面详情,并提供...
此扫描器基于Python3.8.0和Django2.2开发,是一款全开源的漏洞扫描器,借助Celery插件实现了异步的端口扫描和后台扫描,而漏洞扫描则使用了著名漏洞扫描工具AWVS的API实现。 激活虚拟环境 venv\Scripts\activate 3...
Django新闻博客类网站,前端技术(html + css + js + jquery(ajax))、后端技术(Django2.1 + Django restframework + mysql + redis + celery(可能会拓展) + elaticsearch + nginx + uwsgi) Django新闻博客类...
使用Docker Compose开发Django 包括: Python + Node.js Django的 WebSocket服务器 芹菜工作者+芹菜节拍 PostgreSQL 雷迪斯 要求: Docker> = v1.10.3 Docker Compose> = v1.7.1 Python> = 3.5 OS X Docker本...
Web Full Stack Practice:Docker + uWSGI + Celery + Django + Supervisor + React + Nginx + Https + Postgres + Redis 本项目主要介绍基于 Docker 的 Web 开发和部署(开发要求在改动代码时服务或页面能够实时...
3. Celery:Celery是一个分布式任务队列,主要应用于处理大量后台异步任务,如电子邮件发送、文件处理或长时间运行的计算任务。它可以与各种消息代理(如RabbitMQ、Redis等)配合使用,实现任务的调度和分发,提高...
针对高并发场景,可能需要考虑缓存策略(如Redis)、数据库索引优化、异步任务处理(如Celery)以及负载均衡等技术。 10. **安全与隐私**: 考虑到电商系统涉及用户敏感信息,需确保数据传输和存储的安全,采用...