多进程管理器忽略其余代码块的奇怪行为

Strange Behavior of Multiprocess Manager Ignoring Rest of Code Block

我遇到了关于 Manager 的奇怪行为,其中来自同一代码块的代码在实例化后被忽略。

我在 Windows 10 日 运行 宁此。

当我 运行 仅将以下代码放在单独的 test.py 文件中时,一切正常。 Manager() 确实创建了自己的代理进程,并且执行了所有 print() 函数。另外,runIP 过程似乎没有任何问题。

test.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 中使用相同的代码时,其中包含导入 tensorflow 的代码,它变得很奇怪。

main.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!")


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()没有执行,但是通过查看任务管理器,我确实确认代理进程是运行ning。 python 解释器出于某种原因忽略了代码块的其余部分。

我不知道是什么导致了这种行为。这是我第一次在 Python 中尝试多处理,所以我可能做错了什么。

事实证明 Managertensorflow 有问题。

为了确保 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()

这解决了我的问题。