Jupyter Notebook中Python多进程任务无限运行问题求助
问题排查与解决方案
核心问题分析
你的代码存在几个致命问题,导致进程卡住无响应:
- 全局变量无法跨进程共享:多进程中每个子进程会独立复制父进程的内存空间,修改子进程内的
df完全不会影响主进程的df,这种合并方式根本不生效,还会导致资源浪费。 - 函数名不匹配:并行代码里调用的是
task2,但你定义的处理函数是task,这会导致进程找不到目标函数,进而引发无响应。 - Jupyter环境的多进程启动问题:在Windows系统下,Jupyter用
spawn方式启动子进程,若没有用if __name__ == '__main__':包裹多进程启动代码,会导致子进程重复执行整个脚本,陷入无限循环。 - 没有正确收集处理结果:你的任务函数没有返回值,主进程无法获取子进程的处理结果,也就没法完成合并。
修正后的代码
第一步:定义正确的任务函数
每个任务函数负责处理单个CSV文件,返回处理后的DataFrame,不要用全局变量:
import pandas as pd import os from multiprocessing import Pool def process_file(filename): # 拼接完整文件路径 file_path = os.path.join("file directory", filename) # 这里写你的CSV处理逻辑,比如读取和清洗 stage = pd.read_csv(file_path) # 示例处理:替换成你的实际业务逻辑 stage = stage[stage['close'] > 0] return stage
第二步:在Jupyter中正确启动多进程
必须用if __name__ == '__main__':包裹多进程启动代码,避免子进程重复初始化:
if __name__ == '__main__': # 过滤出文件夹下的CSV文件 names = [f for f in os.listdir("file directory") if f.endswith('.csv')] # 用with语句自动管理进程池生命周期 with Pool(4) as pool: # 并行处理所有文件,获取结果列表 processed_dfs = pool.map(process_file, names) # 主进程合并所有处理后的DataFrame final_df = pd.concat(processed_dfs, ignore_index=True) print(final_df.shape)
额外注意事项
- 确保
"file directory"是正确的文件夹路径,避免找不到文件导致进程报错。 - 如果处理的CSV文件很大,可改用
pool.imap或pool.imap_unordered逐步获取结果,减少内存占用。 - 在Jupyter中测试多进程时,不要在循环中反复创建进程池,用完及时关闭(
with语句会自动完成关闭)。
内容的提问来源于stack exchange,提问作者Conjurer
相关产品推荐
相关产品推荐

