APScheduler怎么设置任务不并发


这篇文章主要讲解了“APScheduler怎么设置任务不并发”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“APScheduler怎么设置任务不并发”吧!Windows10 教育版64位
Python 3.6.3
APScheduler 3.6.3Python中定时任务的解决方案,总体来说有四种,分别是:crontabschedulerCeleryAPScheduler,其中:crontab是 Linux 的一个定时任务管理工具,在Windows上面有替代品pycron,但Windows不像 Linux那样有很多强大的命令程序,pycron使用起来有局限性,定制性不好;Scheduler太过于简单、复杂一点的定时任务做起来太困难,特别是以月份以上时间单位的定时任务;Celery依赖的软件比较多,比较耗资源;APScheduler(Advanced Python Scheduler) 基于 Quartz,可以跨平台而且配置方便,提供了date、interval、cron3种不同的触发器,与Linux上原生的 crontab 格式兼容,可以设置任何高度复杂的定时任务,灵活的要死。在此不介绍APScheduler的基本特性,有需要的可以直接去看APScheduler官方文档,我们直接切到主题:APScheduler如何设置任务不并发(即第一个任务执行完再执行下一个)?APScheduler在多个任务相同时间点同时被触发时,会同时并发执行多个任务,如使用下方的示例代码:可以看到,函数job_printer是一个死循环,用来模拟长时间执行的任务,我们使用add_jobAPScheduler中添加2个job_printer,区别是2个任务的时间间隔为:每10秒执行一次每20秒执行一次
因为job_printer是一个死循环,相当于job_printer一直没有被执行完,但其实APScheduler在任务没有被执行完的情况下,同时执行多个不同的job_printer:job text:每10秒执行一次!
job text:每20秒执行一次!
job text:每10秒执行一次!
job text:每20秒执行一次!
job text:每10秒执行一次!
job text:每20秒执行一次!
job text:每10秒执行一次!
job text:每20秒执行一次!
job text:每10秒执行一次!
Execution of job “job_printer (trigger: cron[second=’*/10′], next run at: 2022-07-01 20:47:50 CST)” skipped: maximum number of running instances reached (1)即:可以看到10秒的job_printer和20秒的job_printer交替被执行,而其实10秒的job_printer其实根本没有执行完。这在CPU或者GPU等硬件设备能够承担负载的情况下,当然是好事,但如果你的硬件不够的话,发生OOM等资源不够的情况,程序就被中断了,导致你的模型训练或业务逻辑失败
具体的
我这边是使用APSchedulerTensorflow进行在线学习(online learning)时,在不同的时间节点下会对模型使用不一样的重训练方式,如有2个定时任务(A:每10秒执行一次,B:每20秒执行一次)和2种重训练方式(XY),当你的显存存在如下情况:显存很少只够一个程序进行训练,不能多个程序同时运行,否则会OOM;那么只能引导程序依次执行,而不能并发执行,等当同一时间内XY同时被触发时,只执行其中1个,另外1个不执行。那这个时候又该怎么办呢通过查阅官方文档,发现可以通过设置执行任务的线程数,来控制只有1个执行器进行任务的执行,进而达到执行完任务X再执行任务Y,具体如下:通过向BlockingScheduler设定最大的ThreadPoolExecutor=1,即可达到我们想要的效果!job text:每10秒执行一次!
job text:每10秒执行一次!
job text:每10秒执行一次!
job text:每10秒执行一次!
job text:每10秒执行一次!
Execution of job “job_printer (trigger: cron[second=’*/10′], next run at: 2022-07-01 21:17:50 CST)” skipped: maximum number of running instances reached (1)
job text:每10秒执行一次!
job text:每10秒执行一次!
job text:每10秒执行一次!
job text:每10秒执行一次!
job text:每10秒执行一次!
Execution of job “job_printer (trigger: cron[second=’*/10′], next run at: 2022-07-01 21:18:00 CST)” skipped: maximum number of running instances reached (1)
Execution of job “job_printer (trigger: cron[second=’*/20′], next run at: 2022-07-01 21:18:00 CST)” skipped: maximum number of running instances reached (1)即:可以看到,一直在执行第1个被触发的任务,相同时间被触发的任务都被skipped了~~
当然,如果你想要第1个任务执行完时,执行被跳过的任务,可以通过在add_job中设置misfire_grace_time实现!1.APScheduler如果某个任务挂掉了,整个定时任务程序会中断吗?还是下次时间继续执行该任务?答案是:程序不会中断,到下次执行任务的时间点,还会重新执行。
具体的,使用如下测试代码:可以看到exception_maker已经失败多次,但是不影响其他任务和它自身的下次执行:Job “exception_maker (trigger: cron[second=’*/5′], next run at: 2022-07-01 19:53:30 CST)” raised an exception
Traceback (most recent call last):
File “C:UsersJayceAnaconda3envstf2.3libsite-packagesapschedulerexecutorsbase.py”, line 125, in run_job
retval = job.func(*job.args, **job.kwargs)
File “E:/Code/Python/demo代码/apscheduler设置任务不并发.py”, line 14, in exception_maker
return 1 / 0
ZeroDivisionError: division by zero
Job “exception_maker (trigger: cron[second=’*/5′], next run at: 2022-07-01 19:53:35 CST)” raised an exception
Traceback (most recent call last):
File “C:UsersJayceAnaconda3envstf2.3libsite-packagesapschedulerexecutorsbase.py”, line 125, in run_job
retval = job.func(*job.args, **job.kwargs)
File “E:/Code/Python/demo代码/apscheduler设置任务不并发.py”, line 14, in exception_maker
return 1 / 0
ZeroDivisionError: division by zero
job text:每10秒执行一次!
job text:每10秒执行一次!
Job “exception_maker (trigger: cron[second=’*/5′], next run at: 2022-07-01 19:53:40 CST)” raised an exception
Traceback (most recent call last):
F免费云主机域名ile “C:UsersJayceAnaconda3envstf2.3libsite-packagesapschedulerexecutorsbase.py”, line 125, in run_job
retval = job.func(*job.args, **job.kwargs)
File “E:/Code/Python/demo代码/apscheduler设置任务不并发.py”, line 14, in exception_maker
return 1 / 0
ZeroDivisionError: division by zero
job text:每10秒执行一次!
job text:每10秒执行一次!
Execution of job “job_printer (trigger: cron[second=’*/10′], next run at: 2022-07-01 19:53:40 CST)” skipped: maximum number of running instances reached (1)
Job “exception_maker (trigger: cron[second=’*/5′], next run at: 2022-07-01 19:53:45 CST)” raised an exception
Traceback (most recent call last):
File “C:UsersJayceAnaconda3envstf2.3libsite-packagesapschedulerexecutorsbase.py”, line 125, in run_job
retval = job.func(*job.args, **job.kwargs)
File “E:/Code/Python/demo代码/apscheduler设置任务不并发.py”, line 14, in exception_maker
return 1 / 0
ZeroDivisionError: division by zero
job text:每10秒执行一次!即:感谢各位的阅读,以上就是“APScheduler怎么设置任务不并发”的内容了,经过本文的学习后,相信大家对APScheduler怎么设置任务不并发这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是百云主机,小编将为大家推送更多相关知识点的文章,欢迎关注!

相关推荐: 怎么让python程序正确高效地并发

这篇文章主要介绍“怎么让python程序正确高效地并发”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么让python程序正确高效地并发”文章能帮助大家解决问题。GIL 是 CPython 解释器的实现的一部分,它是一…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/21 22:00
下一篇 03/21 22:00

相关推荐