调度定期事件:Cron及替代方案(包括Celery)
我一直对定期执行一系列操作感兴趣。显然,这个任务应该用cron来完成,对吧?
不过,网上对此似乎有些争议。
让我简单介绍一下我的情况。首先,我的开发环境是在Windows上,而我的生产环境则托管在Webfaction(Linux)。在Windows上似乎没有真正的cron,对吧?而且,我还在使用Django!那么,Django推荐使用什么呢?
Celery,当然是这个了!不过,设置Celery对我来说简直是一场噩梦——请看一下错误信息 'No handlers could be found for logger “multiprocessing”' 使用Celery。而这只是我在使用Celery时遇到的一个问题。还有其他问题,比如一个我独自遇到的套接字错误。
别误会,Celery看起来真的很酷。不过,似乎缺乏支持,而且它的首选后端RabbitMQ也有一些奇怪的限制。不管一个程序多么酷,如果它不能正常工作,那就没什么用!
这就是我希望大家能帮忙的地方。我想了解一下cron或者类似cron的工具,能够在Windows和Linux环境中以相似(最好是完全相同)的方式设置。
(我已经和Celery斗争了大约两周,现在我觉得是时候放弃它了,至少暂时放弃。)
4 个回答
https://github.com/andybak/django-cron
这个工具是由一个简单的定时任务启动的,但所有的调度和设置都是用Python来完成的。
我之前也遇到过同样的问题,一开始觉得用celery(太复杂了)或者cron(和应用程序无关)来解决不太合适,最后发现了Advanced Python Scheduler。我刚开始用这个工具,但感觉它相对成熟和稳定,文档也写得不错,可以支持多种调度格式(比如cron风格)。
根据文档,可以在特定的时间间隔内运行一个函数。
from apscheduler.scheduler import Scheduler
sched = Scheduler()
sched.start()
def hello_world():
print "hello world"
sched.add_interval_job(hello_world,seconds=10)
这个方法是非阻塞的,我通过在我的urls.py
中简单地导入这个模块来运行类似的功能。希望这对你有帮助。
一种简单的方法,不用Celery,可以创建自定义的django-admin命令来处理你的异步或定时任务。
在Windows上,你可以使用at
命令来安排这些任务。在Linux上,你则使用cron
。
如果可以的话,我强烈建议你在开发环境中放弃Windows。使用Linux或者Mac OSX会让你的生活轻松很多。你可以把一台闲置的旧电脑装上Ubuntu,或者在你的Windows电脑上用虚拟机运行Ubuntu。