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

Python多进程独立模块使用问题:代码阻塞无响应求助

Python多进程模块封装阻塞问题解决方法

在Python3环境下将多进程逻辑封装为独立模块时,代码出现阻塞且无法终止,推测是if __name__=='__main__'的问题。设备为MacBook,但代码运行在Docker容器中,请问如何在模块中正常使用多进程?

原模块代码(MultiProcessing.py)

from multiprocessing import Process
    
class MultiProcessing:
    def printing(a):
       print(a)

    def run(self, a):
        with Pool(processes=self.cpuCore) as pool:
            partial_gp = functools.partial(self.printing, a=a)
            full_result = pool.map(partial_gp)
        return full_result

原main.py代码

import MultiProcessing

MP = MultiProcessing()
result = MP.run(a)

原代码存在的问题

  • 未导入Pool(需从multiprocessing导入)和functools库
  • printing方法定义不规范:类内方法要么加@staticmethod装饰器,要么第一个参数为self
  • pool.map用法错误:该方法必须传入可迭代对象作为第二个参数,且参数绑定方式有误
  • main.py缺少if __name__=='__main__'保护,子进程启动时会重复执行初始化逻辑,引发阻塞

修正后的代码

模块代码(MultiProcessing.py)

from multiprocessing import Pool
import functools

class MultiProcessing:
    def __init__(self):
        # 初始化CPU核心数,可按需调整
        self.cpuCore = 4

    @staticmethod
    def printing(a):
        print(a)
        return a  # 需要返回结果时添加return

    def run(self, items):
        # items为待处理的可迭代对象(如列表)
        with Pool(processes=self.cpuCore) as pool:
            full_result = pool.map(self.printing, items)
        return full_result

main.py代码

from MultiProcessing import MultiProcessing

if __name__ == '__main__':
    # 示例待处理数据
    a = [1, 2, 3, 4, 5]
    MP = MultiProcessing()
    result = MP.run(a)
    print("处理结果:", result)

关键原因说明

Docker容器中运行Python多进程时,无论底层是Linux(fork启动模式)还是MacOS(spawn启动模式),必须用if __name__=='__main__'保护主程序入口。因为Pool创建子进程时,子进程会重新导入主模块,若无该保护,MP.run(a)会被重复执行,导致无限创建子进程,最终引发阻塞无法终止。

同时类内方法需规范定义:无需访问实例属性的工具方法用@staticmethod装饰;需访问实例属性的方法保留self参数。pool.map必须传入可迭代对象,否则会触发参数错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:22:05