Python multiprocessing多核心批量处理文件时目标函数未调用问题
问题原因与修复方案
- 核心错误是
Process的传参格式不符合要求,另外还存在依赖导入缺失、变量未初始化的问题,具体修复如下:
1. 修正进程传参格式
multiprocessing.Process的args参数要求传入元组类型,你写的args=(f)不会被识别为单元素元组:Python会将括号视为普通表达式括号,最终传入的是字符串类型的文件路径,进程启动后因参数类型不匹配直接异常退出,这就是日志中出现exitcode=1的原因。
修复方式:在参数后加逗号,声明为单元素元组:
p = Process(target=execute_all, args=(f,))
2. 补全缺失的导入与变量初始化
你的代码中没有导入glob模块,也没有提前初始化files列表就调用append方法,会直接抛出运行时异常,需要在代码开头补全:
import glob from multiprocessing import Process files = []
3. 可选:解决子进程输出缓冲问题
Windows系统下多进程的print输出默认会进入缓冲区,可能出现执行了但看不到打印的情况,可以在打印语句中添加flush=True强制刷新缓冲区:
def execute_all(f): print("Working on file: ", f, flush=True) # 其余业务代码
修复后完整可运行代码
import glob from multiprocessing import Process def execute_all(f): print("Working on file: ", f, flush=True) # 更多业务代码 if __name__ == '__main__': files = [] for file in glob.iglob('C:/workspace/**/*.c', recursive=True): files.append(file) ListOfProcesses = [] Processors = 5 Parts = [files[i:i + Processors] for i in range(0, len(files), Processors)] print("Parts" , Parts) for part in Parts: for f in part: print("File ", f) p = Process(target=execute_all, args=(f,)) print("Process called") p.start() print("Process started") ListOfProcesses.append(p) for p in ListOfProcesses: print(p) p.join()
内容的提问来源于stack exchange,提问作者Anand
相关产品推荐
相关产品推荐

