python - 多进程管理器忽略其余代码块的奇怪行为
问题描述
我遇到了关于 的奇怪行为Manager
,实例化后来自同一代码块的代码被忽略。
我在 Windows 10 上运行它。
当我在单独的test.py
文件上仅运行以下代码时,一切正常。
Manager()
确实创建了它自己的代理进程,并且所有print()
功能都执行。此外,runIP
过程似乎没有任何问题。
测试.py
if __name__ == "__main__":
from Image_Processing.image_processing import runIP
from multiprocessing import Manager
print("TRYING TO CREATE MANAGER")
manager = Manager()
print("CREATED MANAGER")
runIP(manager)
print("ALL DONE!")
输出
TRYING TO CREATE MANAGER
CREATED MANAGER
ALL DONE!
但是,当我在其中运行相同的代码时main.py
,它有 import 的代码tensorflow
,它变得很奇怪。
主文件
if __name__ == "__main__":
from Image_Processing.image_processing import runIP
from multiprocessing import Manager
print("TRYING TO CREATE MANAGER")
manager = Manager()
print("CREATED MANAGER")
runIP(manager)
print("ALL DONE!")
from queue import Queue
from threading import Thread
from stable_baselines import DQN
import Reinforcement_AI.env.seperate_env as sep_env
...
输出
TRYING TO CREATE MANAGER
ALL DONE!
# tensorflow import logs printing
第二个print()
并runIP()
没有执行,但是,通过检查任务管理器,我确实确认代理进程正在运行。由于某种原因,python 解释器只是忽略了代码块的其余部分。
我不知道是什么导致了这种行为。这是我第一次尝试在 Python 中进行多处理,所以我可能做错了什么。
解决方案
原来Manager
有问题tensorflow
。
为了确保在对Manager
进行任何操作之前被实例化tensorflow
,请将与 相关的每个代码移动tensorflow
到一个函数中,包括导入。
然后调用中的函数if __name__ == "__main__":
。
def launchAgent():
from stable_baselines import DQN
import Reinforcement_AI.env.seperate_env as sep_env
from queue import Queue
from threading import Thread
#tf related code
...
if __name__ == "__main__":
from Image_Processing.image_processing import runIP
from multiprocessing import Manager
print("TRYING TO CREATE MANAGER")
manager = Manager()
print("CREATED MANAGER")
runIP(manager)
launchAgent()
这解决了我的问题。