Python 轻量级任务调度 sched,使用特别丝滑!

在日常编写爬虫、自动化程序时,你是不是也遇到过这种需求:我想让这个任务等一会再执行,又或者是想配置一个定时操作,到了时间就自动执行。
很多人第一反应可能是 time.sleep(),但问题是它不够灵活,且会阻塞整个线程!
其实,Python 标准库里早就给我们准备了一个轻量级的调度器:sched
下面我们来一起了解一下 sched 的正确使用方式。
介绍
sched 是 Python 内置的一个 事件调度器,它可以在指定的时间点或者延迟特定时间之后,执行某些任务。
而且它不像 apscheduler 这种功能全面的第三方库,也没有复杂的 cron 表达式。 sched 足够轻巧,使用门槛很低。
一句话总结:sched = 轻量级的“时间管理小助手”。
特点
sched 主要包含下面几个特点:
1. 纯内置,无需安装
直接import sched就能用,省去 pip 的麻烦。2. 事件调度机制简单
支持“延迟多少秒后执行” 或者 “在某个时间点执行”。3. 可自定义优先级
如果两个任务时间一样,可以给它们设置优先级,谁先跑谁后跑。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
更多推荐


所有评论(0)