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

Python中是否有简单方法实现双线程文件读写(读线程空时等待)?

Python多线程文件读写:写入线程+阻塞式读取线程实现

要实现写入线程写文件、读取线程在文件为空时等待的需求,核心是用线程同步机制协调读写操作——直接轮询文件状态会浪费资源,用threading.Condition是更高效的方案。

以下是可直接运行的代码示例:

import threading
import time

# 用于协调读写的条件变量
file_condition = threading.Condition()
FILE_PATH = "test.txt"

def write_worker():
    # 模拟分批写入数据
    for idx in range(5):
        data = f"批次{idx+1}:测试内容\n"
        with file_condition:
            with open(FILE_PATH, "a", encoding="utf-8") as f:
                f.write(data)
                f.flush()  # 强制刷新缓冲区,确保内容写入磁盘
            print(f"写入:{data.strip()}")
            # 通知等待的读取线程
            file_condition.notify()
        time.sleep(1.5)  # 模拟写入间隔

def read_worker():
    while True:
        with file_condition:
            # 等待直到文件非空
            file_condition.wait_for(lambda: _check_file_not_empty())
            # 读取文件头部内容(示例读取第一行)
            with open(FILE_PATH, "r", encoding="utf-8") as f:
                content = f.readline()
                print(f"读取:{content.strip()}")
            # 检查文件是否已空,为空则提示等待
            if not _check_file_not_empty():
                print("读取线程:文件已空,等待新内容...")

def _check_file_not_empty():
    """检查文件是否非空(避免读取整个文件,提升效率)"""
    try:
        with open(FILE_PATH, "r", encoding="utf-8") as f:
            return f.read(1) != ""
    except FileNotFoundError:
        # 文件不存在视为空
        return False

if __name__ == "__main__":
    # 启动线程:读取线程设为守护线程,主程序退出时自动终止
    write_thread = threading.Thread(target=write_worker)
    read_thread = threading.Thread(target=read_worker, daemon=True)
    
    write_thread.start()
    read_thread.start()
    
    write_thread.join()
    print("写入任务完成,程序退出")

关键细节说明

  • 线程同步:threading.Condition的wait_for()会自动处理锁的获取/释放,循环检查文件状态,直到满足非空条件,避免无效轮询。
  • 文件缓冲区:写入后必须调用flush(),否则Python的文件缓冲区可能不会立即把内容写入磁盘,导致读取线程看不到最新数据。
  • 守护线程:读取线程设为守护线程,当写入线程完成、主程序退出时,读取线程会自动终止,避免程序挂起。
  • 空文件判断:通过读取单个字符判断文件是否为空,比读取整个文件更高效,尤其适合大文件场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 04:30:55