Python脚本写入CSV并定期删旧文件:多线程方案是否可行?
问题解答
是否适合用多线程?
完全适合。你的文件清理属于IO密集型任务,Python的GIL在IO操作时会自动释放,多线程可以让清理任务在后台独立执行,不会阻塞主流程的SQL查询和CSV写入;同时你还能把清理频率从10秒一次调整为更合理的间隔(比如1小时),大幅减少不必要的磁盘IO开销。
多线程实现方案
用Python标准库threading创建守护线程专门处理文件清理,主线程专注于定时执行SQL查询和写CSV操作,示例代码如下:
import time import threading from datetime import datetime, timedelta import os import csv # 实际场景建议用标准csv模块写文件 def write_csv(): # 连接SQL Server并查询数据的逻辑 # 示例:模拟查询结果 query_result = [("col1_val", "col2_val"), ("col3_val", "col4_val")] # 生成带时间戳的唯一文件名,避免重复 timestamp = datetime.now().strftime("%Y%m%d_%H%M%S_%f") csv_path = os.path.join("folder_A", f"data_{timestamp}.csv") # 写入CSV文件 with open(csv_path, "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerow(["column1", "column2"]) # 写表头 writer.writerows(query_result) # 写数据 print(f"已生成CSV文件: {csv_path}") def delete_old_csv(): folder_path = "folder_A" # 计算3天前的时间戳 cutoff = datetime.now() - timedelta(days=3) # 遍历文件夹,删除旧文件 for filename in os.listdir(folder_path): file_full_path = os.path.join(folder_path, filename) if os.path.isfile(file_full_path): # 获取文件修改时间 file_mod_time = datetime.fromtimestamp(os.path.getmtime(file_full_path)) if file_mod_time < cutoff: os.remove(file_full_path) print(f"已删除过期文件: {file_full_path}") def cleanup_loop(interval): # 后台清理循环,每隔interval秒执行一次 while True: delete_old_csv() time.sleep(interval) if __name__ == "__main__": # 创建清理线程,设置为守护线程(主进程退出时自动终止) # 这里设置清理间隔为3600秒(1小时),可根据需求调整 cleanup_thread = threading.Thread(target=cleanup_loop, args=(3600,), daemon=True) cleanup_thread.start() # 主线程:每10秒执行一次SQL查询和写CSV while True: write_csv() time.sleep(10)
额外优化点
- 调整清理间隔:3天的过期周期,完全不需要每10秒跑一次清理,设置1小时或半天一次就足够,既满足需求又减少磁盘压力。
- 避免重复执行:如果担心清理任务耗时超过间隔时间,可以给
delete_old_csv加一个线程锁,防止并发执行。 - 优化写文件性能:实际场景中用
csv模块批量写入比逐行写更高效,大结果集可以考虑分块写入。
内容的提问来源于stack exchange,提问作者Nili
相关产品推荐
相关产品推荐

