Python多进程调用局部函数时AttributeError问题及解决方案咨询
解决Python multiprocessing调用局部函数的AttributeError问题
你遇到的问题根源在于:multiprocessing默认使用pickle序列化目标函数,但局部函数无法被pickle正确序列化。你尝试的global声明无效,是因为子进程启动时会重新导入当前模块,此时main()函数并未执行,子进程的全局作用域里根本不存在func的定义。
以下是两种无需将函数移到全局作用域的可行方案:
方案1:使用cloudpickle序列化局部函数
cloudpickle支持序列化局部函数、lambda等pickle无法处理的对象,是跨平台的通用解决方案。
- 先安装依赖:
pip install cloudpickle
- 修改代码:
import multiprocessing as mp import cloudpickle import os def run_pickled_func(pickled_func): # 子进程中反序列化并执行函数 func = cloudpickle.loads(pickled_func) func() def main() -> None: def func() -> None: print(f"Hello World from process {os.getpid()}") # 序列化局部函数 pickled_func = cloudpickle.dumps(func) # 将序列化后的函数作为参数传递给全局的执行函数 process = mp.Process(target=run_pickled_func, args=(pickled_func,)) process.start() process.join() if __name__ == "__main__": main()
方案2:利用fork上下文(仅Linux/macOS可用)
如果你的代码只在Linux或macOS环境运行,可以使用fork启动子进程。fork会直接复制父进程的内存空间,不需要序列化函数,因此可以直接调用局部函数:
import multiprocessing as mp import os def main() -> None: def func() -> None: print(f"Hello World from process {os.getpid()}") # 指定fork上下文 ctx = mp.get_context('fork') process = ctx.Process(target=func) process.start() process.join() if __name__ == "__main__": main()
注意:Windows系统不支持fork,该方案无法在Windows上运行。
内容的提问来源于stack exchange,提问作者ugo_capeto
相关产品推荐
相关产品推荐

