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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:06:05