Python multiprocessing远程服务器报错:找不到defs模块
问题:multiprocessing多进程代码本地正常,远程服务器报错
ModuleNotFoundError: No module named 'defs' 代码文件说明
defs.py代码
import numpy as np def g(n): A = np.random.rand(n, n) B = np.random.rand(n, n) return A * B def run_complex_operations(operation, input, pool): result = pool.map(operation, input) return result
主运行代码
import defs import numpy as np import time import multiprocessing as mp x = 10 n = 10000 l = [n] * x start = time.time() if __name__ == '__main__': processes_pool = mp.Pool(3) l[:] = defs.run_complex_operations(defs.g, range(x), processes_pool)
报错信息
Process SpawnPoolWorker-1: Traceback (most recent call last): File "C:\ProgramData\Anaconda3\lib\multiprocessing\process.py", line 315, in _bootstrap self.run() File "C:\ProgramData\Anaconda3\lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) File "C:\ProgramData\Anaconda3\lib\multiprocessing\pool.py", line 114, in worker task = get() File "C:\ProgramData\Anaconda3\lib\multiprocessing\queues.py", line 358, in get return _ForkingPickler.loads(res) ModuleNotFoundError: No module named 'defs'
报错原因分析
1. 多进程启动模式的序列化逻辑限制
Python 3.8及以上版本在Windows系统中,multiprocessing默认使用spawn模式创建子进程。这种模式下,子进程会重新启动独立的Python解释器,重新导入主脚本并执行,而非直接复制父进程内存。当子进程需要反序列化父进程传递的defs.g函数时,必须能找到defs模块,若子进程的Python路径(sys.path)中不包含defs.py所在目录,就会触发模块找不到的错误。
2. 工作目录与模块路径不匹配
单独调用defs模块正常,是因为主进程的sys.path默认包含当前工作目录。但远程服务器上如果用绝对路径运行主脚本(比如python D:\scripts\main.py),子进程的当前工作目录可能不是D:\scripts,导致sys.path中没有该目录,无法定位到defs模块。而本地运行时,你大概率是在defs.py所在目录直接执行脚本,所以路径不存在问题。
3. Python版本差异的间接影响
虽然本地3.9.7和远程3.8.5都默认使用spawn模式,但不同版本的multiprocessing在子进程sys.path的初始化逻辑上存在细微差异,导致远程环境下的路径问题被暴露出来。
内容的提问来源于stack exchange,提问作者eigenvector
相关产品推荐
相关产品推荐

