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

