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

Ubuntu下Python multiprocessing调用starmap函数代码冻结问题求助

解决Python multiprocessing.starmap在Ubuntu环境冻结的问题

以下是针对你的场景(Arch正常、Ubuntu用conda环境出现冻结)的排查和解决步骤:

  • 调整multiprocessing启动方式
    Ubuntu的conda环境默认可能使用spawn启动子进程,而Arch通常用fork,这会导致模块初始化、全局变量引用等场景下出现死锁。在代码入口处添加启动方式设置:

    from multiprocessing import set_start_method, freeze_support
    
    if __name__ == '__main__':
        freeze_support()
        set_start_method('fork')
        # 你的主程序逻辑
    
  • 对齐Python和依赖库版本
    对比Arch系统Python与conda环境的Python版本,以及multiprocessing相关依赖的版本差异。尝试将conda环境的Python版本调整为与Arch一致:

    # 替换为你Arch上的Python版本,比如3.10
    conda install python=3.10
    conda reinstall -c conda-forge multiprocessing
    
  • 排查目标函数的执行逻辑
    冻结大概率是__some_func__内部出现死锁或阻塞:

    • 在__some_func__关键步骤添加打印或日志,定位卡住的位置:
      def __some_func__(arg1, arg2):
          print(f"Processing {arg1}, {arg2}")
          # 后续逻辑
      
    • 拆分args为单个小任务,单独调用__some_func__测试,确认是否是特定参数触发的问题。
  • 限制进程池大小并检查系统资源
    避免进程池大小超过Ubuntu的系统资源限制:

    • 初始化进程池时显式指定进程数(建议不超过CPU核心数):
      import multiprocessing
      self.pool = multiprocessing.Pool(processes=multiprocessing.cpu_count() // 2)
      
    • 检查系统资源限制:
      ulimit -a
      
      若进程数限制过低,可修改/etc/security/limits.conf添加:
      * soft nproc 4096
      * hard nproc 8192
      
  • 避免类成员函数的序列化陷阱
    如果__some_func__是类的成员函数,在spawn模式下会因为类实例序列化问题导致异常或冻结。将其改为顶层函数,或传递独立的可序列化函数:

    # 定义为顶层函数,而非类成员
    def some_func(arg1, arg2):
        # 原__some_func__的逻辑
    
    # 调用时使用顶层函数
    result = self.pool.starmap(some_func, args)
    

内容的提问来源于stack exchange,提问作者Arpith_BioE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:33:14