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

Python多线程同步求助:CSV文件写入数据损坏问题

解决Python多线程写CSV的同步问题

嘿,这个坑我踩过!你遇到的t137变成t137t137的问题,本质是**多线程竞争共享资源(CSV文件)**导致的写入重叠——两个线程同时往文件里写数据,操作系统还没把其中一个线程的写入操作完整落地,另一个就插进来写了,结果两段内容就“粘”在了一起。

朋友说的用锁同步完全是正确的思路,针对你的场景,最适合的是Python标准库threading模块里的**Lock(互斥锁)**,它简单、高效,能完美解决这种“同一时间只能有一个线程操作共享资源”的需求。

具体实现步骤

1. 导入模块并创建全局锁

首先导入需要的模块,然后创建一个全局的锁实例——所有需要写CSV的线程都要共用这个锁:

import threading
import csv

# 创建全局互斥锁,所有写CSV的线程共用它
csv_write_lock = threading.Lock()

2. 在写CSV的代码块中加锁

不管是你的串口读取线程,还是其他需要写CSV的线程,都要在打开文件并写入的代码块前后加锁。推荐用with语句来管理锁,它会自动帮你获取和释放锁,哪怕写入过程中抛出异常也不会导致死锁:

串口读取线程示例

def serial_read_write_thread():
    while True:
        # 替换成你实际的串口读取逻辑
        serial_data = "t137"
        
        # 关键:用锁保护写CSV的操作
        with csv_write_lock:
            # 打开文件(推荐用追加模式"a")
            with open("output.csv", "a", newline="", encoding="utf-8") as csv_file:
                writer = csv.writer(csv_file)
                writer.writerow([serial_data])  # 写入一行数据

其他写CSV的线程示例

如果还有另一个线程也要写CSV,同样用锁保护:

def another_write_thread():
    while True:
        # 模拟其他数据源的数据
        other_data = "sample_data"
        
        with csv_write_lock:
            with open("output.csv", "a", newline="", encoding="utf-8") as csv_file:
                writer = csv.writer(csv_file)
                writer.writerow([other_data])

3. 启动线程

最后正常启动你的线程即可:

if __name__ == "__main__":
    # 创建线程
    t1 = threading.Thread(target=serial_read_write_thread)
    t2 = threading.Thread(target=another_write_thread)
    
    # 设置为守护线程(可选,随主线程退出而退出)
    t1.daemon = True
    t2.daemon = True
    
    # 启动线程
    t1.start()
    t2.start()
    
    # 让主线程保持运行,按回车退出
    input("Press Enter to stop...\n")

为什么选Lock而不是其他锁?

  • Lock是最基础的互斥锁,同一时间只能有一个线程获取它,完美适配你的“独占写文件”需求;
  • 相比RLock(可重入锁),Lock更轻量,你的场景不需要在同一个线程里多次获取锁,所以用Lock足够;
  • 用with语句管理Lock,代码更简洁安全,避免手动调用acquire()和release()时可能出现的死锁问题。

内容的提问来源于stack exchange,提问作者galaxy_twirl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:29:49