使用Python Multiprocessing库时遭遇UnboundLocalError错误求助
解决Python Multiprocessing中的UnboundLocalError问题
核心问题本质
UnboundLocalError: local variable 'file_name' referenced before assignment 不是多进程本身的问题,而是代码里某条分支中file_name还没定义就被调用了——单线程时可能没触发到这个分支,批量多进程处理才暴露出来。
排查与修复步骤
先查变量定义逻辑
检查update_events和upsert_obj里所有用到file_name的地方,重点看是否存在条件分支遗漏:比如只在if块里定义file_name,但else或者异常分支里没定义就直接用。举个典型错误例子:def handle_id(id): if get_api_data_success: file_name = f"{id}.json" # 处理数据 upsert_to_blob(file_name, data) # 这里如果API请求失败,file_name根本没定义直接把
file_name的定义提到分支外面,比如开头就赋值:file_name = f"{id}_events.json",确保任何分支都能访问到。给进程加日志追踪
多进程下错误难定位,给每个任务加日志,记录当前处理的ID和file_name状态:import logging logging.basicConfig(level=logging.INFO) def handle_id(id): file_name = f"{id}_events.json" logging.info(f"Start processing ID: {id}, file: {file_name}") try: data = update_events(id) upsert_obj(file_name, data) except Exception as e: logging.error(f"Fail on ID {id}, file: {file_name}, error: {str(e)}") raise从日志里能直接看出是API调用失败还是Blob上传出错,以及对应ID,快速定位问题点。
拆分异常捕获范围
把API请求和Blob上传的异常分开捕获,明确错误来源:def handle_id(id): file_name = f"{id}_events.json" # 单独捕获API请求错误 try: data = update_events(id) except Exception as e: print(f"API call failed for ID {id}: {str(e)}") return # 单独捕获Blob上传错误 try: upsert_obj(file_name, data) except Exception as e: print(f"Blob upload failed for {file_name}: {str(e)}")优化进程池任务处理
用imap_unordered代替map,能逐个获取任务结果,实时看到哪个ID出错:from multiprocessing import Pool def main(): id_list = [你的18000个ID] with Pool(processes=4) as pool: for _ in pool.imap_unordered(handle_id, id_list): pass
额外提示
- 给Azure Blob上传加重试机制,比如用
tenacity库做自动重试,避免网络波动导致的失败。 - 可以把18000个ID分批次处理,比如每1000个一批,方便出错后快速恢复。
内容的提问来源于stack exchange,提问作者clattenburg cake
相关产品推荐
相关产品推荐

