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
相关产品推荐
相关产品推荐

