在日常编写爬虫、自动化程序时,你是不是也遇到过这种需求:我想让这个任务等一会再执行,又或者是想配置一个定时操作,到了时间就自动执行。

很多人第一反应可能是 time.sleep(),但问题是它不够灵活,且会阻塞整个线程!

其实,Python 标准库里早就给我们准备了一个轻量级的调度器:sched

下面我们来一起了解一下 sched 的正确使用方式。

介绍

sched 是 Python 内置的一个 事件调度器,它可以在指定的时间点或者延迟特定时间之后,执行某些任务。

而且它不像 apscheduler 这种功能全面的第三方库,也没有复杂的 cron 表达式。 sched 足够轻巧,使用门槛很低。

一句话总结:sched = 轻量级的“时间管理小助手”

特点

sched 主要包含下面几个特点:

  1. 1. 纯内置,无需安装
    直接 import sched 就能用,省去 pip 的麻烦。

  2. 2. 事件调度机制简单
    支持“延迟多少秒后执行” 或者 “在某个时间点执行”。

  3. 3. 可自定义优先级
    如果两个任务时间一样,可以给它们设置优先级,谁先跑谁后跑。

  4. 4. 单线程调度
    它自己不会开线程,默认是顺序执行。如果要多线程,就得自己配合 threading

实战一下

先来个最简单的例子:

import sched
import time

# 创建调度器
scheduler = sched.scheduler(time.time, time.sleep)

def task(name):
    print(f"任务 {name} 执行时间:{time.strftime('%X')}")

# 安排两个任务
scheduler.enter(2, 1, task, argument=("A",))  # 2秒后执行
scheduler.enter(4, 1, task, argument=("B",))  # 4秒后执行

print("调度开始:", time.strftime('%X'))
scheduler.run()
print("调度结束:", time.strftime('%X'))

运行结果如下:

调度开始:21:00:00
任务 A 执行时间:21:00:02
任务 B 执行时间:21:00:04
调度结束:21:00:04

接着,我们编写一个定时爬虫小任务

假设我们需要编写了个小爬虫,要每隔 5 秒抓一次网页,可以如下编写代码:

import sched
import time
import requests

scheduler = sched.scheduler(time.time, time.sleep)

def fetch():
    print(f"抓取开始:{time.strftime('%X')}")
    res = requests.get("https://httpbin.org/get")
    print("状态码:", res.status_code)
    
    # 再次安排自己,形成循环
    scheduler.enter(5, 1, fetch)

# 第一次执行
scheduler.enter(0, 1, fetch)
scheduler.run()

这样 fetch() 就会自动循环执行,不用手动添加 while True 代码了

最后,我们看看 sched 如何配合线程使用

PS:需要指出的是,sched.run() 是阻塞的,有时候我们想让它在后台运行,可以用 threading

import sched
import time
import threading

scheduler = sched.scheduler(time.time, time.sleep)

def job():
    print("执行任务:", time.strftime("%X"))

def run_scheduler():
    scheduler.run()

# 安排任务
scheduler.enter(3, 1, job)

# 开线程跑调度器
t = threading.Thread(target=run_scheduler)
t.start()

print("主线程还能继续干别的事哦:", time.strftime("%X"))

总结一下

sched 是 Python 自带的轻量级任务调度器,功能虽然简单,但基本够用。

特别适合一些小场景和小工具,比如:定时任务、延迟执行

PS:sched 不适合企业级的复杂调度任务,大型项目更推荐 APScheduler 或者 Celery

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐