使用Celery调度任务
使用Celery调度任务。尝试使Celery任务工作可能会很困难,因为会使用很多部分,并且这些部分之间还会相互联系。许多常见的小技巧仍然起作用:
先使最简单的配置能够工作
使用Python调试器以及输出语句来观察发生了什么
提升日志级别(比如,将任务执行单元设置为—logleveldebug)来获得更多的信息
也有一些Celery专用工具。
Eagerscheduling
在你的Django设置里,可以添加:
然后,Celery就会忽略全部调度机制,立即调用你的代码。
这就是说,设置了CELERY_ALWAYS_EAGER=True后,这两个语句变得一样:
你可以使用这种方法使你的核心内容在引入Celery调度问题之前开始工作。
查看队列
只要你在开发时使用Django自带的中间件,你的队列就存储在Django数据库里。这样你就可以很容易的查看它。在你的应用里向admin.py添加几行:
现在,你可以在/admin/django/message文件夹下查看队列上是否有任务。每一个信息(message)就是一个来自Celery的请求--让任务执行单元执行任务。信息的内容很难理解,但是有时候仅仅只知道你的任务是否在队列里就很有用了。信息会留在数据库里,所以看到很多信息并不意味着你的任务只在被执行。
检查结果
任何时候调度一个任务,Celery都会返回一个AsyncResult对象。你可以保存那个任务,然后稍后使用它检查任务是否执行完成,是否成功,以及结果。
周期性调度
另一个常见例子是周期性调度任务。Celery使用另一个程序celerybeat来实现。Celerybeat一直运行,等一个调度任务到执行时间了,celerybeat就会把它加入队列去执行。
显而易见,只有一个celerybeat程序可以运行(不像任务执行单元,只要你需要,你就可以运行任意个)
启动celerybeat和启动一个任务执行单元相似。打开另一个窗口,设置Django环境,然后:
有几种方法告诉celery在调度上运行一个任务。我们将使用在Django数据库表里存储计划任务这种方法。这使你很容易地修改计划任务,即使Django和Celery正在运行。
添加这条配置信息:
现在,你可以打开Djangoadmin文件夹,前往/admin/djcelery/periodictask/文件夹添加计划任务。下面是一些字段的说明:
Name—用来标记预订的任务
Task(registered)-只要你在添加任务后启动Django至少一次,这里应该是任何一个你定义过的任务。如果你没有看到你想要的任务,最好检查原因,修复它,然后再使用写一个字段。
Task(custom)-这里你可以键入任务的全称(例如,myapp.tasks.add),但是最好使用上面registeredtasks字段
Enabled-由于某些原因,比如暂停它,你不想要任务真得运行,你可以不选择它
Interval-如果你想要任务间隔一段时间重复运行。你可能需要使用绿色的“+”定义一个新的计划任务。这很简单,例如,每5分钟运行,5设置为“Every”,“Period”设置为minutes。
Crontab-如果任务要在指定时间运行,使用crontab替代Interval。使用绿色的“+”,填写minute,hour,dayofweek,dayofmonth,anddayofyear。你可以使用“*”在任何字段替代一个具体值,但是注意-如果你使用“*”在minute字段,你的任务将会在选定的那个小时内的每个分钟里都执行。例如:每天早上7:30执行,设置minute为“30”,hour为“7”,其余字段为“*”。
Arguments-如果需要为任务传入参数,你可以展开这部分,设置*args和**kwargs字段。
ExecutionOprions-高级设置,这里我们不会讨论。
默认计划任务
如果你想你的一些任务默认计划任务,不依赖于某人在安装完你的应用后在数据库里配置它们,你可以使用Djangofixtures把你的计划任务作为应用的初始数据。
在你的数据库里配置你想要的计划任务
用json格式保存计划任务
在你的应用里创建一个fixtures文件夹
如果你再也不想编辑这些计划任务,你可以把你的json文件复制到fixtures文件夹中命名为initial_data.json。每次syncdb运行时,Django都会加载它,如果你在数据库里编辑了计划任务,你就会得到错误,或者失去更改。(你仍然可以添加新的计划任务,你只是不能更改从fixtures文件夹初始数据里加载的那些)
如果你想把这些作为初始调度,把你的文件命名为其他的,当配置一个使用你应用的网站时加载它就可以了:
提示和技巧
不要把model对象传递给任务
因为任务不会立即运行,当一个任务运行并使用传入的model对象时,数据库的对应纪录可能已经改变。如果任务此时对model对象做了一些修改并且保存起来,数据库里的这些改变就会被旧数据覆盖了。
更安全的做法是保存对象,传递纪录的键名,在任务里重新获得对象。
在任务里调度其他任务
执行一个任务的时候调度另一个完全可行。这可以用于保证第二个任务在第一个任务做完一些必要的工作之前不会运行。
不要在一个任务里等待另一个任务
如果一个任务等待另一个任务,它的任务执行单元将一直阻塞而不能做其他事情直到等待结束。这早晚造成死锁。
如果你的任务A里想要调度任务B,在任务B结束之后,做一些其他的工作,最好创建一个任务C做这些工作,在任务B结束时调度任务C。
下一步
一旦你理解了这些基础部分,最好阅读一下Celery用户手册中的部分内容。我建议从这些章节开始;其他的要不和Django没有关系,要不太过高级:
tasks
periodicTasks
在生产环境里使用Celery
这里描述的Celery配置是为了开发方便,绝不能应用在生产环境。
为了在生产环境里使用,最重要的修改是停止使用kombu.transport.djanggo作为中间件,使用RabbitMQ或者其他健壮的可伸缩的等价物替换。
Python培训、Python培训班、Python培训机构,就选光环大数据!
还不够过瘾?想学习更多?点击 http://hadoop.aura.cn/python/ 进行Python学习!
大数据培训、人工智能培训、Python培训、大数据培训机构、大数据培训班、数据分析培训、大数据可视化培训,就选光环大数据!光环大数据,聘请专业的大数据领域知名讲师,确保教学的整体质量与教学水准。讲师团及时掌握时代潮流技术,将前沿技能融入教学中,确保学生所学知识顺应时代所需。通过深入浅出、通俗易懂的教学方式,指导学生更快的掌握技能知识,成就上万个高薪就业学子。 更多问题咨询,欢迎点击------>>>>在线客服!