Python为函数添加multiprocessing多进程后运行无响应问题求助(Windows Jupyter)
问题排查及修复方案
核心问题点
- 函数逻辑错误:
list.append()方法返回值为None,你需要直接返回待加入列表的单条记录,而非append操作的结果。同时多进程内存空间相互隔离,子进程中修改全局tmplist对主进程完全不可见,必须通过函数返回值汇总结果。 - 变量名大小写不匹配:函数参数定义为
StockID(末尾大写D),函数内部使用的是StockId(末尾小写d),运行会抛出NameError。 - Windows系统+Jupyter环境限制:Windows下Python多进程默认采用
spawn启动模式,直接在Jupyter单元格内定义的函数无法被序列化传递给子进程,会导致子进程启动失败、代码卡死。 - 冗余代码:使用
with语句管理Pool时,上下文退出会自动执行close()和join()操作,手动调用属于多余逻辑。
修复步骤
步骤1:调整函数定义
将函数单独保存到同级目录的stock_utils.py文件中,解决Jupyter下函数无法序列化的问题:
# stock_utils.py 文件内容 def AddToTable(StockId): # 此处替换为你实际的业务处理逻辑,返回单条待加入列表的记录 return StockId
步骤2:调整主进程代码
在Jupyter单元格中运行如下代码即可:
import multiprocessing import pandas as pd from stock_utils import AddToTable if __name__ == '__main__': ArrId = [2345,1234,234532,4532,3464532,245345456,34534,234323,4524] with multiprocessing.Pool() as p: # p.map返回的结果就是所有函数返回值组成的列表,直接作为汇总后的tmplist使用 tmplist = p.map(AddToTable, ArrId) # 可直接转换为DataFrame df = pd.DataFrame(tmplist, columns=['StockId']) print(tmplist)
替代方案
如果你的任务属于IO密集型(比如接口请求、文件读取等),不需要使用多进程,直接用多线程即可规避Jupyter的兼容性问题,代码更简单:
from concurrent.futures import ThreadPoolExecutor ArrId = [2345,1234,234532,4532,3464532,245345456,34534,234323,4524] def AddToTable(StockId): # 业务逻辑 return StockId with ThreadPoolExecutor() as executor: tmplist = list(executor.map(AddToTable, ArrId)) print(tmplist)
内容的提问来源于stack exchange,提问作者Discover
相关产品推荐
相关产品推荐

