Python Jupyter Notebook单函数多进程调用失败问题求助
解决multiprocessing调用函数未执行的问题
你的代码出现函数未执行的假象,核心原因有几个:
1. 未传递必要参数
test函数定义需要接收ta52参数,但创建Process时没有通过args传递该参数,子进程执行时会触发参数缺失错误,但子进程的异常不会直接在主进程输出,导致看起来函数没运行。
2. 全局变量无法跨进程共享
g5、g6是主进程的全局变量,子进程启动时会复制一份独立的副本,子进程内对它们的修改不会同步到主进程,就算函数正常执行,主进程也看不到结果。
3. 未定义的依赖变量
代码中s1、s2、s3、s4、s5未定义,子进程执行时会触发NameError,同样不会在主进程显示,进一步导致函数执行中断。
修改后的代码示例
下面是修复这些问题的版本,使用multiprocessing.Pool来更高效地利用CPU,同时通过返回值获取计算结果:
import multiprocessing as mp import numpy as np import timeit # 先定义s1-s5示例数据(根据实际需求替换) s1 = ["abc", "def"] s2 = ["ghi", "jkl"] s3 = ["mno", "pqr"] s4 = ["stu", "vwx"] s5 = ["yz1", "234"] def process_item(item): # 把单条数据的计算逻辑抽出来,方便多进程分发 s11 = [sum(c1 != c2 for c1, c2 in zip(item, j)) for j in s1] s12 = [sum(c1 != c2 for c1, c2 in zip(item, j)) for j in s2] s13 = [sum(c1 != c2 for c1, c2 in zip(item, j)) for j in s3] s14 = [sum(c1 != c2 for c1, c2 in zip(item, j)) for j in s4] s15 = [sum(c1 != c2 for c1, c2 in zip(item, j)) for j in s5] min1 = min(s11) min2 = min(s12) min3 = min(s13) min4 = min(s14) min5 = min(s15) return min1 + min2 + min3 + min4 + min5, [min1, min2, min3, min4, min5] if __name__ == '__main__': # 示例ta52数据(替换为你的实际数据) ta52 = ["abcde", "fghij", "klmno"] start = timeit.default_timer() # 使用Pool,默认利用全部CPU核 with mp.Pool() as pool: results = pool.map(process_item, ta52) # 整理结果到g5和g6 g5 = np.array([res[0] for res in results]) g6 = np.array([res[1] for res in results]).T stop = timeit.default_timer() print('Time: ', stop - start) print('g5:', g5) print('g6:', g6)
关键修改说明
- 把单条数据的计算逻辑抽成
process_item函数,避免全局变量依赖,方便多进程分发任务 - 使用
mp.Pool()自动管理进程池,充分利用所有CPU算力 - 通过返回值传递计算结果,避免跨进程全局变量共享的问题
- 提前定义
s1-s5等依赖变量,确保子进程能正常访问
内容的提问来源于stack exchange,提问作者morteza alizade babtangali
相关产品推荐
相关产品推荐

