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

Python多进程数量增加时陷入无限等待问题求助

嘿,我仔细看了你的代码和问题描述,发现几个核心问题导致进程数量上去后就陷入无限等待,咱们一步步来拆解和修复:

问题根源拆解

1. 多进程内存隔离的误区

你犯了多进程新手常踩的坑:多进程之间是完全内存隔离的!你把numpy数组a传给子进程时,每个进程拿到的都是数组的副本,在子进程里修改a[pos]根本不会影响主进程的原数组,最后通过队列传回去的也只是每个进程自己手里的副本——这不仅做了无用功,还额外占用大量内存,进程数量多了之后很容易引发卡顿甚至阻塞。

2. 队列取值逻辑错误

你用que1.get(block=False)获取队列元素的逻辑有问题:

  • 如果某个进程还没来得及把结果放入队列,这个调用会直接抛出Queue.Empty异常;
  • 就算改成默认的block=True,如果有进程异常退出没把数据放进队列,主进程就会一直等待,也就是你遇到的“无限等待”;
  • 循环进程列表取数据的逻辑也不合理,队列里的元素顺序和进程列表顺序不一定对应,很容易漏取或重复取。

3. 冗余的进程终止操作

在process.join()之后调用process.terminate()完全没必要——join()本身就是等待进程正常结束,这时候进程已经终止了,再调用terminate没有任何意义。

修复后的代码

我重新写了一份代码,解决了上述所有问题,逻辑更清晰也更可靠:

from multiprocessing import Process, Queue
import time
import numpy as np

def compute_square(num, pos, que):
    # 只负责计算平方,把位置和结果传回主进程即可
    square_val = num * num
    que.put((pos, square_val))

if __name__ == "__main__":
    NP = 100  # 进程数量
    processes = []
    result_queue = Queue()
    start_num = 2

    # 创建所有进程
    for i in range(NP):
        current_num = start_num + i
        p = Process(target=compute_square, args=(current_num, i, result_queue))
        processes.append(p)

    print(f"Created {NP} processes")
    start_time = time.time()

    # 启动所有进程
    for p in processes:
        p.start()

    # 等待所有进程执行完毕
    for p in processes:
        p.join()

    # 从队列取出所有结果(固定取NP次,对应每个进程一次put)
    results = []
    for _ in range(NP):
        results.append(result_queue.get())

    # 把结果整理到数组中
    a = np.zeros(NP)
    for pos, val in results:
        a[pos] = val

    total_time = time.time() - start_time
    print(f"Total time taken: {total_time:.4f} seconds")
    print("First 5 elements of result array:", a[:5])
额外优化建议
  • 对于这种简单的并行计算,没必要手动管理Process和Queue,用multiprocessing.Pool会更省心,它会自动帮你管理进程池,代码也更简洁:
from multiprocessing import Pool
import time
import numpy as np

def compute_square(args):
    num, pos = args
    return (pos, num * num)

if __name__ == "__main__":
    NP = 100
    start_num = 2
    args_list = [(start_num + i, i) for i in range(NP)]

    start_time = time.time()
    with Pool(processes=NP) as pool:
        results = pool.map(compute_square, args_list)

    a = np.zeros(NP)
    for pos, val in results:
        a[pos] = val

    total_time = time.time() - start_time
    print(f"Total time taken with Pool: {total_time:.4f} seconds")
  • 进程数量不是越多越好,通常设置为CPU核心数的1-2倍即可,过多的进程会导致频繁的上下文切换,反而降低运行效率。

内容的提问来源于stack exchange,提问作者Patel Parth Rajendrabhai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:57:29