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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 18:48:15