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

