APScheduler官方User guide文档
后台需要做一个每隔30秒扫描模拟器是否在线的功能,所以就用到了APScheduler(安装使用pip即可)。现在暂时在windows下做,所以放弃了只支持Linux的crontab和celery。
按网上的例子做了个demo结果报错No module named 'apscheduler.scheduler’
一开始demo是这么写的:
from apscheduler.scheduler import Scheduler
sched = Scheduler()
@sched.interval_schedule(seconds=5)
def myTask():
d1 = timezone.now()
print("time", d1.strftime("%Y-%m-%d %H:%M:%S"))
sched.start()
后来发现他们的APScheduler版本都是2.1.2,而我的已经是3.6.3了,新的版本已经没有这个包了。接着我又搜到了一个网友写的3.0.5的demopython定时任务 apscheduler详细使用教程,又把demo改了一下
from apscheduler.schedulers.blocking import BlockingScheduler
def myTask():
d1 = timezone.now()
print("time", d1.strftime("%Y-%m-%d %H:%M:%S"))
scheduler = BlockingScheduler()
scheduler.add_job(func=myTask, trigger='cron', second='*/5')
scheduler.start()
发现定时任务倒是能运行,但我的Django服务器启动不起来了!!急的我。本来以为函数放错文件位置了,一开始我放在项目设置的setting.py下,以为这样阻碍了服务器的启动,再改到任意app的view.py下,还是不行。好了只能硬着头皮去看全英文官方文档了,发现schedulers分不同的种类。
BlockingScheduler算是会实行block阻塞程序运行(会阻塞主线程的运行),执行到它那里就一直执行它了。
而换一种BackgroundScheduler就解决问题了,这种schedulers按官方说是“A scheduler that runs in the background using a separate thread”,会用新起一个线程执行,所以不会阻碍服务器的运行了。
新的demo如下:
from apscheduler.schedulers.blocking import BackgroundScheduler
def myTask():
d1 = timezone.now()
print("time", d1.strftime("%Y-%m-%d %H:%M:%S"))
scheduler = BackgroundScheduler()
scheduler.add_job(func=myTask, trigger='cron', second='*/5')
scheduler.start()
总结一些几个特性吧:
- 一般这个放哪个文件应该都可以运行,网友多放在某app的views.py下(发现如果放在自定义的文件下它不会运行,应该还是需要放在对Django有意义的它至少会执行一次的文件下才行,至于多进程多线程会不会重复执行的问题可以看下面的一个文章链接)
- 一般起一个scheduler就可以了,通过add_job添加删除任务
- 每个任务调度都是新起一个线程进行的
APScheduler中两种调度器的区别及使用过程中要注意的问题
关于 django 使用 apscheduler 一次任务被重复执行问题
看到还有使用django-apscheduler插件的,问了一下下面这位博主两者的区别得到的答案:
django-apscheduler只是针对django框架对apscheduler做的一个简化的版本,没有apscheduler的功能丰富,两者都也可以用,django-apscheduler更加轻量级一些,适合简单的任务