为何importlib的exec_module在子线程执行后模块内找不到对应类
根本原因
- 调用
thread.start()后子线程和主线程是并行执行的,主线程不会等待子线程里的spec.loader.exec_module(module)执行完成,就立刻执行了inspect.getmembers遍历模块成员。此时模块加载逻辑还没运行完,MyClass还没有被写入模块对象,自然找不到对应类。 - 单线程场景下
exec_module是同步阻塞执行的,运行完之后模块的所有成员都已经初始化完成,遍历查找自然可以正常匹配到MyClass。
修复方案
在启动子线程后调用thread.join()方法,阻塞主线程直到子线程的模块加载逻辑完全执行完成,再执行后续的类查找逻辑即可,修改后的代码如下:
# 选项2:修复后的线程版本,可正常运行 thread = threading.Thread(target=spec.loader.exec_module, args=[module]) thread.start() thread.join() # 新增该行,等待子线程加载模块完成
内容的提问来源于stack exchange,提问作者Torantula
相关产品推荐
相关产品推荐

