Python多进程写入百万随机数文件行数不足问题求助
问题分析与修复方案
核心问题点
- 未等待子进程完成: 主进程启动子进程后立即计算结束时间并退出,导致子进程还没写完所有数据就被终止,这是文件数据不足的主要原因。
- 跨进程文件句柄无效: 多进程环境下,主进程打开的文件对象
f无法直接被子进程复用,每个子进程的文件操作实际上是独立的,可能导致数据丢失或覆盖。 - 文件未正常关闭: 未显式关闭文件,缓冲区数据可能未完全写入磁盘。
修复后的代码
import time import random from multiprocessing import Process, Lock def task(lock, filename, count): # 每个子进程独立打开文件,确保句柄有效 with open(filename, "a") as f: for _ in range(count): lock.acquire() try: f.write(f"{random.randint(0, 1000)}\n") finally: lock.release() # 确保锁一定会释放,避免死锁 if __name__ == "__main__": mutex = Lock() filename = "file2.txt" total_count = 1000000 process_count = 2 per_process_count = total_count // process_count start = time.time() processes = [] for _ in range(process_count): p = Process(target=task, args=(mutex, filename, per_process_count)) processes.append(p) p.start() # 等待所有子进程执行完毕 for p in processes: p.join() end = time.time() print(f'Execution Time: {end - start:.4f} seconds')
关键修改说明
- 等待子进程完成: 使用
join()方法让主进程等待所有子进程执行结束后再计算耗时,确保所有数据都写入文件。 - 子进程独立打开文件: 每个子进程在任务函数内部打开文件,避免跨进程共享文件句柄的问题,同时用
with语句自动关闭文件,保证缓冲区数据写入磁盘。 - 锁的安全释放: 将
release()放在finally块中,即使写入过程出现异常,锁也能正常释放,防止死锁。 - 代码复用: 将任务逻辑封装成一个通用函数,方便扩展更多进程。
内容的提问来源于stack exchange,提问作者Ariana
相关产品推荐
相关产品推荐

