You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 01:45:44