You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:42:46