【Django】定时任务APScheduler

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更加轻量级一些,适合简单的任务

django-apscheduler和apscheduler的安装和示例

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值