Python实现并行处理独立约束LSQ问题(替代Matlab parfor)
解决Python多进程并行处理独立LSQ问题(类似Matlab parfor)
你的代码在Windows环境(IDLE运行)下无法工作,核心问题是Windows多进程的启动机制要求主逻辑必须放在if __name__ == '__main__':块中,同时还有一些小的代码细节问题,以下是修正后的完整方案:
问题分析
- Windows系统下,
multiprocessing采用spawn方式启动子进程,会重新导入当前脚本,如果没有主入口判断,会导致子进程重复执行多进程代码,引发错误。 - 你的代码依赖全局变量
data,虽然子进程会复制全局变量,但将其作为函数参数传入更清晰,也能避免潜在的内存浪费。 with multiprocessing.Pool()上下文管理器会自动关闭pool,无需手动调用pool.close()。
修正后的代码
import numpy as np import multiprocessing def dummyFUNCTION(i, data): # 复制data避免修改原数组(如果不需要保留原数据可以省略copy) X = data.copy() X[:, i] *= 3 return X[:, i] if __name__ == '__main__': data = np.array([[1,2,3], [4,5,6], [7,8,9], [10,11,12]]) # 串行版本(验证结果) U_serial = np.zeros((4, 3)) for i in range(3): U_serial[:, i] = dummyFUNCTION(i, data) print("串行结果:") print(U_serial) # 并行版本 U_parallel = np.zeros((4, 3)) # 创建进程池,默认使用CPU核心数 with multiprocessing.Pool() as pool: # 使用starmap传递多参数,比apply_async更简洁 results = pool.starmap(dummyFUNCTION, [(i, data) for i in range(3)]) for idx, res in enumerate(results): U_parallel[:, idx] = res print("\n并行结果:") print(U_parallel)
针对50k个任务的优化建议
当处理50k个独立任务时,建议:
- 用
pool.imap或pool.imap_unordered代替starmap,避免一次性生成50k个任务列表占用过多内存。 - 如果每个LSQ任务计算量不大,进程池的大小可以设置为CPU核心数的1-2倍,避免进程切换开销过大。
- 对于numpy数组,可以考虑使用共享内存(
multiprocessing.Array或numpy.sharedmem)来减少数据复制的开销,但如果每个任务只需要读取数据,子进程的复制开销在现代系统中也可以接受。
内容的提问来源于stack exchange,提问作者Abdul Suleman
相关产品推荐
相关产品推荐

