Windows下Python脚本周期性执行更优方案及APScheduler调度器资料查询
解决方案与说明
一、Windows环境下更优的周期性执行方案
1. Windows任务计划程序(资源占用最优)
这是Windows原生的任务调度工具,完全无需Python进程持续运行,仅在任务触发时启动脚本执行,资源占用极低,适合周期性执行的离线任务。
配置步骤:
- 打开「任务计划程序」→ 创建基本任务
- 设置触发条件(如每小时执行一次)
- 操作选择「启动程序」,程序或脚本选你的Python解释器路径(如
C:\Python39\python.exe),添加参数填你的脚本绝对路径(如"C:\scripts\csv_import.py") - 注意配置任务的运行权限,确保能访问目标文件夹和SQL Server
脚本调整建议:
- 路径用原始字符串避免转义:
base_dir = r"C:\path" - 处理CSV时用
with open(...)确保文件关闭,避免删除时报错 - 导入SQL推荐用
pandas.to_sql(配合fast_executemany=True)或SQL Server的BULK INSERT,比逐行插入效率高得多
2. APScheduler异步调度器(Python进程内优化)
如果需要Python进程持续运行(比如有其他关联逻辑),推荐使用AsyncIOScheduler,针对IO密集型任务(如文件读取、数据库写入)的性能更优,资源占用比BlockingScheduler更高效。
修改后的示例代码:
import os import asyncio import pandas as pd from sqlalchemy import create_engine from apscheduler.schedulers.asyncio import AsyncIOScheduler async def import_csv_to_sql(file_path, engine): # 读取CSV(可结合aiofiles实现纯异步读取) df = pd.read_csv(file_path) # 批量写入SQL Server,提升写入速度 await df.to_sql( name="your_target_table", con=engine, if_exists="append", index=False, method="multi", chunksize=1000 ) # 确保文件释放后删除 os.remove(file_path) async def s_job(): base_dir = r"C:\path" # 仅筛选.csv文件 csv_files = [f for f in os.listdir(base_dir) if f.lower().endswith(".csv")] # 创建SQLAlchemy数据库连接引擎 engine = create_engine("mssql+pyodbc://username:password@server_name/db_name?driver=ODBC+Driver+17+for+SQL+Server") # 并发处理所有CSV文件 tasks = [import_csv_to_sql(os.path.join(base_dir, f), engine) for f in csv_files] await asyncio.gather(*tasks) if __name__ == "__main__": scheduler = AsyncIOScheduler() scheduler.add_job(s_job, 'interval', hours=1) scheduler.start() try: asyncio.get_event_loop().run_forever() except (KeyboardInterrupt, SystemExit): pass
二、APScheduler各类调度器详解
APScheduler提供多种调度器适配不同场景:
- BlockingScheduler:你当前使用的类型,阻塞主线程,适合独立运行的定时任务脚本,逻辑简单但会持续占用一个Python进程。
- BackgroundScheduler:在后台线程运行调度,主线程可执行其他逻辑,适合已有业务逻辑的应用(如后台服务),无需阻塞主线程。
- AsyncIOScheduler:基于asyncio异步IO框架,适合IO密集型任务,支持异步任务调度,性能和资源利用率更优。
- GeventScheduler:基于gevent协程库,适合使用gevent的异步场景,通过协程实现高并发。
- TornadoScheduler:专为Tornado Web框架设计,适配Tornado的IO循环。
- TwistedScheduler:适配Twisted异步框架,用于Twisted应用中的定时任务。
- QtScheduler:集成Qt应用的事件循环,用于Qt GUI程序中的定时任务。
内容的提问来源于stack exchange,提问作者Yakup Bilen
相关产品推荐
相关产品推荐

