Python多线程如何按指定顺序执行,将Pandas DataFrame依次写入CSV
控制多线程按指定顺序写入的实现方案
你的核心需求是爬虫逻辑并行执行,写入操作严格按df1→df2→df3→df4的顺序执行,完全可以用你熟悉的wait()/notifyAll()(Python中对应threading.Condition的wait()/notify_all())实现,只需要增加全局顺序标记作为执行判断条件即可,不需要修改统一的目标函数结构。
完整实现代码
import threading import pandas as pd import time import random df1 = pd.DataFrame(columns=["col1","col2","col3"]) df2 = pd.DataFrame(columns=["col1","col2","col3"]) df3 = pd.DataFrame(columns=["col1","col2","col3"]) df4 = pd.DataFrame(columns=["col1","col2","col3"]) # 同步控制变量 condition = threading.Condition() # 当前允许写入的线程序号,0对应df1,1对应df2,以此类推 current_write_order = 0 def function(df, self_order): # 爬虫逻辑,并行执行无阻塞 ###webscraping, compile web data to dataframe # 这里加随机休眠模拟不同线程爬取速度不同,可以验证顺序控制效果 time.sleep(random.randint(1,5)) print(f"线程{self_order}爬取完成,等待写入") # 写入前进入同步判断逻辑 with condition: # 循环判断是否轮到自己写入,避免虚假唤醒 while current_write_order != self_order: condition.wait() # 轮到自己执行写入 df.to_csv('output.csv', mode='a') print(f"线程{self_order}写入完成") # 更新允许写入的序号 global current_write_order current_write_order += 1 # 唤醒所有等待的线程判断是否轮到自己 condition.notify_all() if __name__ == '__main__': t1 = threading.Thread(target=function, args=(df1, 0)) t2 = threading.Thread(target=function, args=(df2, 1)) t3 = threading.Thread(target=function, args=(df3, 2)) t4 = threading.Thread(target=function, args=(df4, 3)) t1.start() t2.start() t3.start() t4.start() # 等待所有线程执行完成 t1.join() t2.join() t3.join() t4.join()
核心逻辑说明
- 爬虫阶段完全并行执行,不会有任何等待,不会损失多线程的性能优势
- 只有写入阶段会做顺序控制:每个线程爬取完成后,会先判断当前是否轮到自己写入,没轮到就释放锁进入等待状态,不会占用系统资源
- 之所以你之前用
wait()/notifyAll()不生效,是因为没有搭配对应的顺序状态标记,所有线程被唤醒后都会抢锁执行,自然无法保证顺序,加上顺序判断条件后就可以精准控制执行顺序 - 必须在循环中判断顺序是否匹配,不能用单次if判断,避免操作系统的虚假唤醒导致顺序错乱
内容的提问来源于stack exchange,提问作者Luke Hamilton
相关产品推荐
相关产品推荐

