`

python轻量级定时任务

 
阅读更多
提到定时任务调度的时候,相信很多人会想到芹菜celery,要么就写个脚本塞到crontab中。不过,一个小的定时脚本,要用celery的话太“重”了。所以,我找到了一个轻量级的定时任务调度的库:schedule。
 
库的安装还是最简单的pip install schedule,使用起来也是很容易理解的。我们从最简单的栗子看起:
 
import schedule
import time
 
def job():
    print("I'm working...")
 
schedule.every(10).minutes.do(job)
schedule.every().hour.do(job)
schedule.every().day.at("10:30").do(job)
schedule.every(5).to(10).days.do(job)
schedule.every().monday.do(job)
schedule.every().wednesday.at("13:15").do(job)
 
while True:
    schedule.run_pending()
    time.sleep(1)
 
这是在pypi上面给出的示例。这个栗子简单到我不需要怎么解释。而且,通过这个栗子,我们也可以知道,schedule其实就只是个定时器。在while True死循环中,schedule.run_pending()是保持schedule一直运行,去查询上面那一堆的任务,在任务中,就可以设置不同的时间去运行。跟crontab是类似的。
 
但是,如果是多个任务运行的话,实际上它们是按照顺序从上往下挨个执行的。如果上面的任务比较复杂,会影响到下面任务的运行时间。比如我们这样:
 
import datetime
import schedule
import time
 
def job1():
    print("I'm working for job1")
    time.sleep(2)
    print("job1:", datetime.datetime.now())
 
def job2():
    print("I'm working for job2")
    time.sleep(2)
    print("job2:", datetime.datetime.now())
 
def run():
    schedule.every(10).seconds.do(job1)
    schedule.every(10).seconds.do(job2)
 
    while True:
        schedule.run_pending()
        time.sleep(1)
 
接下来你就会发现,两个定时任务并不是10秒运行一次,而是12秒。是的。由于job1和job2本身的执行时间,导致任务延迟了。
 
其实解决方法也很简单:用多线程/多进程。不要幼稚地问我“python中的多线程不是没有用吗?”这是两码事。开了一条线程,就把job独立出去运行了,不会占主进程的cpu时间,schedule并没有花掉执行一个任务的时间,它的开销只是开启一条线程的时间,所以,下一次执行就变成了10秒后而不是12秒后。
 
import datetime
import schedule
import threading
import time
 
def job1():
    print("I'm working for job1")
    time.sleep(2)
    print("job1:", datetime.datetime.now())
 
def job2():
    print("I'm working for job2")
    time.sleep(2)
    print("job2:", datetime.datetime.now())
 
def job1_task():
    threading.Thread(target=job1).start()
 
def job2_task():
    threading.Thread(target=job2).start()
 
def run():
    schedule.every(10).seconds.do(job1_task)
    schedule.every(10).seconds.do(job2_task)
 
    while True:
        schedule.run_pending()
        time.sleep(1)
 
就是这么简单。
 
唯一要注意的是,这里面job不应当是死循环类型的,也就是说,这个线程应该有一个执行完毕的出口。一是因为线程万一僵死,会是非常棘手的问题;二是下一次定时任务还会开启一个新的线程,执行次数多了就会演变成灾难。如果schedule的时间间隔设置得比job执行的时间短,一样会线程堆积形成灾难,所以,还是需要注意一下的。
 
schedule这个库使用起来比较简单,内容不是很多。我这里介绍的大概用法基本上够用了,还想了解其他特性的话,可以参考官网:https://schedule.readthedocs.io/en/stable/
 
分享到:
评论

相关推荐

    python基于Flask+apscheduler的定时任务系统

    在Python的Web开发中,Flask是一个轻量级且强大的框架,它允许开发者轻松地构建自己的Web应用。而当我们需要在Web应用中实现定时任务时,可以借助于ApScheduler库,它是一个强大的任务调度库,支持多种调度策略。...

    Python-Python3HueyZreorpcRedisFlaskRTask轻量级分布式任务管理系统

    【Python3 Huey Zreorpc Redis Flask RTask:轻量级分布式任务管理系统详解】 在IT行业中,构建高效、可扩展的任务管理系统对于大型项目来说至关重要。"Python3 Huey Zreorpc Redis Flask RTask"就是一个这样的解决...

    Python-轻量级的时间管理CLI工具

    Python是一种广泛使用的编程语言,尤其在开发命令行工具方面,其简洁、易读的语法使得创建轻量级的CLI(命令行界面)工具变得非常高效。"Python-轻量级的时间管理CLI工具"是一个专为时间管理设计的命令行应用程序,...

    Python-Devops定时调用http接口定时执行SSH命令的WEB定时任务工具

    Flask是一个轻量级的Python Web框架,而Flask-APScheduler则是在这个基础上添加的定时任务插件,它允许开发者在Web应用中安排任务按照预设的时间间隔执行。APScheduler提供了多种调度策略,如cron表达式、间隔时间等...

    (Repost)它是一个轻量级的_Python_定时任务调度框架。APScheduler_支持

    (Repost)它是一个轻量级的_Python_定时任务调度框架。APScheduler_支持三种调_Python_APScheduler

    python_Flak定时任务Demo

    Python Flask 是一个轻量级的Web服务框架,它允许开发者快速构建自己的应用。而Flask-APScheduler则是基于APScheduler库的一个扩展,用于在Flask应用中实现定时任务功能。这个"python_Flask定时任务Demo"是一个示例...

    毕设项目基于SpringBoot+Vue的轻量级定时任务管理系统源码+数据库+项目说明(含前端+后端).zip

    毕设项目基于SpringBoot+Vue的轻量级定时任务管理系统源码+数据库+项目说明(含前端+后端).zip 【1】项目代码完整且功能都验证ok,确保稳定可靠运行后才上传。欢迎下载使用!在使用过程中,如有问题或建议,请及时...

    Schedule入门.zip

    **Python轻量级定时任务库Schedule** 在Python编程中,我们常常需要执行一些定时任务,例如定期备份数据、定时发送邮件或自动更新某些信息。Schedule是一个轻量级且易于使用的库,它允许开发者以自然的方式来定义和...

    Job Plus项目是基于SpringBoot+Vue的轻量级定时任务管理系统+源代码+文档说明

    7. 强自定义:支持在线配置定时任务请求类型、请求路径、请求参数、Cron表达式,即时生效; 8. 动态控制:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效; 9. 执行策略:支持丰富的执行策略,...

    Job Plus项目是基于SpringBoot+Vue的轻量级定时任务管理系统job-plus.zip

    该项目利用了基于springboot + vue + mysql的开发...Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

    python定时备份文件

    - **schedule库**:这是一个轻量级的库,可以按照固定的时间间隔执行任务。例如,你可以定义一个函数来执行文件压缩操作,然后使用`schedule.every().day.at("HH:MM")`来设置每天的特定时间执行该函数。 - **...

    轻量级框架 。实现了定时任务功能,分布式任务队列,命令行控制台,数据库脚本自动化,单元测试, rpc-Group.zip

    标题中的“轻量级框架”通常指的是那些设计简洁、资源消耗低、易于理解和使用的软件框架。这类框架在IT行业中很受欢迎,因为它们可以快速开发应用,同时保持代码的可维护性和扩展性。在这个特定的场景中,我们看到该...

    Python-huey小型多线程任务队列

    Python中的huey是一个轻量级、灵活且功能强大的任务队列库,主要设计用于处理异步任务和后台作业。huey提供了一种简单的方法来在Python应用中引入多线程和多进程,使得复杂的任务可以被分解为可独立执行的小单元,...

    定时url,定时任务执行,每隔秒执行请求网址

    这表明它可能是一个跨平台的应用,可能采用了Java、Python等跨平台语言编写,或者是一个用Web技术构建的轻量级应用程序。这样的工具简化了定时任务的设定,降低了对用户的技术要求,对于那些希望快速实现定时URL请求...

    定时任务执行器

    - **Python的APScheduler**:对于Python开发者,APScheduler提供了一个轻量级且灵活的定时任务库。 - **Node.js的node-cron**:对于Node.js环境,node-cron提供了类似Cron的定时任务功能。 - **Docker的Cron Job**...

    Python-SchedulePython任务调度库

    总的来说,Python Schedule 库为Python开发者提供了一种轻量级的定时任务解决方案,适合用于小型项目或者作为大型项目中的辅助工具。它简化了定时任务的配置,让开发者能够更专注于业务功能的实现,而不是调度的复杂...

    python 开发在Windows下定时执行python程序+使用说明.zip

    1. **使用Python的`schedule`库**:`schedule`是一个轻量级的库,易于理解和使用。首先,需要通过`pip install schedule`来安装。然后,定义一个函数来执行你的Python任务,并使用`schedule.every().day.at("HH:MM")...

    Python-MrQueue一个Python的分布式worker任务队列使用Redis和gevent

    Gevent是一个基于cooperative multitasking(协作式多任务)的Python库,它通过greenlet(轻量级线程)实现并发。与传统的多线程或多进程模型相比,gevent通过使用事件驱动和非阻塞I/O来提高性能。在MrQueue中,...

    Python任务调度之sched.pdf

    Python的`sched`模块是一个轻量级的任务调度器,它提供了在特定时间点执行任务的能力。这个模块在一些不需要复杂的定时任务调度或者不需要与操作系统级别的定时器交互的场景下非常实用。`sched`的主要功能是通过`...

    Python-donkey类似cron的简洁工具库用来定期执行任务

    Python-donkey是一个轻量级的工具库,它模仿了Unix系统中的cron机制,用于在Python环境中实现定时任务的调度。这个库非常适合那些需要在特定时间间隔或特定时间点执行某些任务的应用程序,如数据抓取、日志清理、...

Global site tag (gtag.js) - Google Analytics