多进程管理器忽略其余代码块的奇怪行为
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 中尝试多处理,所以我可能做错了什么。
事实证明 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()
这解决了我的问题。
我遇到了关于 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 中尝试多处理,所以我可能做错了什么。
事实证明 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()
这解决了我的问题。