Python多进程池使用注意事项与异常处理指南
本文详解Python中使用multiprocessing.Pool时的关键注意事项。重点说明Pool必须在__main__下调用,多进程内异常默认被静默跳过且需手动捕获记录,以及数据通过参数传入或全局变量(只读)传递的正确方式。
进程池运行环境与异常处理机制
使用进程池时,必须确保Pool对象的创建和任务提交代码位于 `if __name__ == '__main__':` 判断语句块内部,否则在Windows等系统下会引发报错。
当多进程执行过程中发生错误时,该特定进程会被直接跳过,且默认情况下不会向控制台打印任何错误信息,这可能导致问题难以排查。
多进程数据传递与全局变量限制
在 `if __name__ == '__main__':` 块中定义的数据,必须通过参数传递给主处理函数。如果直接在主处理函数中引用而未传参,会导致主函数无法获取数据值并报错。
如果不采用传参方式,可以定义全局变量。但需要注意的是,全局变量的值在多进程内部无法被修改,仅能读取。
具体实现代码如下所示:
from multiprocessing import Pool # 进程池,用于多进程
import os # 用于获取当前执行的文件名
import time
import traceback # 用于捕获异常
import sys # 用于捕获异常
def main_func(i): # 多进程运行的函数
try: # 多进程中发生异常是不会打印错误信息,并且当前进程会直接跳过,所以异常需要自行捕获
rand_time = random.randint(1, 3) # 随机产生1~3的整数
time.sleep(rand_time )
print(i)
except:
current_filename = str(os.path.basename(sys.argv[0]))[:-3] # 获取当前文件名称
cur_err_filname = current_filename + '_error.txt'
error_info = sys.exc_info() # 打印异常
with open(f'{cur_err_filname }', 'a') as f:
error_str = f'{i}:ERROR OCCURRED,{time.strftime("%Y-%m-%d %H:%M:%S")}:\n {error_info[0]}: {error_info[1]}' # 记录当前进程特征值,错误发生时间 ,错误类型,错误概述
print(error_str, file=f) # 通过打印方式写入文件
traceback.print_tb(error_info[2], file=f) # 错误细节描述(包括bug的代码位置)
f.write(f"{'=' * 50}\n") # 分行
if __name__ == '__main__': # 必须在此语句下面运行,不然会报错
pool = Pool(5) # 定义进程数量
for i in range(20):
pool.apply_async(main_func, (i, )) # 调用函数执行多进程
pool.close() # 关闭进程池
pool.join() # 阻塞进程,此两部不能少,保证多进程正常运行
以上内容总结了Python多进程编程中的核心要点,希望能为读者的学习提供参考,欢迎继续支持本站获取更多技术内容。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













