顺德网络营销网站长沙网站seo收费
在py里面,我们常用ProcessPoolExecutor跑多进程。
我们一般这样跑:
executor.submit(self.要跑进程的函数名, 函数传参xxx)
随后用
future.result()
确保任务完成。
但是不是时时刻刻都能保证进程内不出错,不报错
使用我们一般会对future.result()包一层try except
比如我就这样写
try:future.result() # 确保任务完成except Exception as e:print(f"[Error] 文件处理异常:{file_path}")tb = traceback.extract_tb(e.__traceback__)# 遍历堆栈信息for frame in tb:filename, lineno, funcname, text = frameprint(f"文件名:{filename}")print(f"行号:{lineno}")print(f"函数名:{funcname}")print(f"代码内容:{text}")
但是最后的保存打印长这样子:
文件名:C:\Users\Administrator\xxx
行号:128
函数名:process_dic
代码内容:future.result() # 确保任务完成
文件名:C:\py_environment\lib\concurrent\futures\_base.py
行号:451
函数名:result
代码内容:return self.__get_result()
文件名:C:\py_environment\lib\concurrent\futures\_base.py
行号:403
函数名:__get_result
代码内容:raise self._exception
这只告诉我错误在future.result(),搞得根本没办法定位错误源头,这是由于e.__traceback__ 只包含父进程的堆栈,无法获取子进程内部的详细错误位置。
怎么办呢,在executor里面调的函数里面套一层try except就好了
这里分两个思路:
1.直接在executor里面调的函数里面except中打印错误源头,即:
except Exception as e:tb = e.__traceback__while tb.tb_next: # 找到最内层的错误位置tb = tb.tb_next# 单行错误信息error_line = f"[Error] 文件处理失败:{file_path} | 错误类型: {type(e).__name__} | 错误信息: {str(e)} | 行号: {tb.tb_lineno} | 文件名: {tb.tb_frame.f_code.co_filename}"print(error_line)
2.在executor里面调的函数里面except中抓到错误原后手动raise出来