python定时任务介绍

本文介绍了Python中四种执行定时任务的方式:死循环结合time.sleep()、使用apscheduler库、使用Timer类以及事件调度器模块sched。其中,apscheduler库推荐用于多次运行任务,而Timer和sched适用于单次定时任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定时任务

本文介绍几种简单的执行定时任务的方法,包含两种可以重复运行定时任务的方法以及两种只能定时运行一次任务的方法

死循环 + time.sleep() (定时多次运行)

第一种办法简单粗暴。那就是在一个死循环中,使用线程睡眠函数 sleep()。

import time

def dosomething(s):
    print(s)

def timedTask():
    while True:
        dosomething('run')
        time.sleep(10)

if __name__ == '__main__':
    timedTask()
    print('main')		# 这行代码永远不会被运行

这种方法能够执行固定间隔时间的任务。但是由于程序是单线程并且是死循环,因此是阻隔线程, timedTask() 一直占有 CPU 资源,导致后续操作无法执行。不建议使用

使用 apscheduler 库添加调度任务(定时多次运行)

此方法需要先安装 APScheduler 库,这里只讨论定时调度任务,关于APScheduler的更多讲解请参考这篇文章

运行调度任务需要以下三个步骤:

  1. 新建一个 schedulers (调度器) 。
  2. 添加一个调度任务(job stores)。
  3. 运行调度任务。
import time
from apscheduler.schedulers.background import BackgroundScheduler

def timedTask(s):
    print(s)

if __name__ == '__main__':
    # 创建后台执行的 schedulers
    scheduler = BackgroundScheduler()
    # 添加调度任务
    # 调度方法为 timedTask,触发器选择 interval(间隔性),间隔时长为 2 秒
    scheduler.add_job(timedTask, 'interval', args=("run",), seconds=2)
    # 启动调度任务
    scheduler.start()
    while True:
        print(time.time())
        time.sleep(5)

这种方法可以多次执行调度任务,而且不会阻隔线程,后续语句可以正常运行,推荐使用

使用 Timer 类启用非阻隔线程(只定时运行一次)

使用 threading 库的 Timer 类可以设定多长时间以后调用函数,不会影响后面语句的运行,比如下面的代码,会先执行后续语句,到设定的时间再执行 dosomething,但是这种方法的 dosomething 只会输出一次,不能多次运行

from threading import Timer
import time

# 定时任务
def dosomething(s):
    print(s)
    
def timedTask():
    # __init__(self, interval, function, args=None, kwargs=None)
    # 注意args参数必须是 tuple 类型,而且要在输入完所有参数后加一个逗号,
    # 否则可能会报参数数量错误 takes XX positional argument but XX were given
    
    #Timer(1, dosomething, (1,)).start()
    Timer(1, dosomething, ('run',)).start()

if __name__ == '__main__':
    timedTask()
    while True:
        print(time.time())
        time.sleep(5)

使用事件调度器模块 sched (只定时运行一次)

sched 是事件调度器,它通过 scheduler 类来调度事件,从而达到定时执行任务的效果,而且sched 还多了一个优先级参数。

这种方式跟上面说的Timer的区别在于,sched 方式中会先执行完调度事件,再执行后续语句。而 Timer 不会等待定时任务,可以直接执行后续的语句。

scheduler 中的每个调度任务只会工作一次,不会无限循环被调用。如果想重复执行同一任务, 需要重复添加调度任务。

import sched
import time

def timedTask():
    # 初始化 sched 模块的 scheduler 类
    scheduler = sched.scheduler(time.time, time.sleep)
    # 增加调度任务, priority 参数为优先级,数值越小优先级越高
    # enter(self, delay, priority, action, argument=(), kwargs=_sentinel)
    scheduler.enter(10, 2, task, ('run2',))
    scheduler.enter(10, 1, task, ('run1',))
    # 运行任务
    scheduler.run()

# 定时任务
def task(s):
    print(s)

if __name__ == '__main__':
    timedTask()
    while True:
        print(time.time())
        time.sleep(5)
### PyCharm 打开文件显示全的解决方案 当遇到PyCharm打开文件显示全的情况时,可以尝试以下几种方法来解决问题。 #### 方法一:清理缓存并重启IDE 有时IDE内部缓存可能导致文件加载异常。通过清除缓存再启动程序能够有效改善此状况。具体操作路径为`File -> Invalidate Caches / Restart...`,之后按照提示完成相应动作即可[^1]。 #### 方法二:调整编辑器字体设置 如果是因为字体原因造成的内容显示问题,则可以通过修改编辑区内的文字样式来进行修复。进入`Settings/Preferences | Editor | Font`选项卡内更改合适的字号大小以及启用抗锯齿功能等参数配置[^2]。 #### 方法三:检查项目结构配置 对于某些特定场景下的源码视图缺失现象,可能是由于当前工作空间未能正确识别全部模块所引起。此时应该核查Project Structure的Content Roots设定项是否涵盖了整个工程根目录;必要时可手动添加遗漏部分,并保存变更生效[^3]。 ```python # 示例代码用于展示如何获取当前项目的根路径,在实际应用中可根据需求调用该函数辅助排查问题 import os def get_project_root(): current_file = os.path.abspath(__file__) project_dir = os.path.dirname(current_file) while not os.path.exists(os.path.join(project_dir, '.idea')): parent_dir = os.path.dirname(project_dir) if parent_dir == project_dir: break project_dir = parent_dir return project_dir print(f"Current Project Root Directory is {get_project_root()}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值