首页 > 解决方案 > 多进程管理器忽略其余代码块的奇怪行为

问题描述

我遇到了关于 的奇怪行为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 中进行多处理,所以我可能做错了什么。

标签: pythonmultiprocessingpython-multiprocessing

解决方案


原来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()

这解决了我的问题。


推荐阅读