从这个问题Multiprocessing code works upon import, breaks upon being called扩展解决方案,我已经在我的项目中注入了一些多处理代码,这些代码已经迅速破解。
我认为存在进口问题。我有两个模块。 test.py
看起来像:
print 'omnia praeclara'
import multi4
if __name__ == "__main__":
multi4.init_manager()
print 'rara sunt'
和multi4.py
看起来像:
import multiprocessing as mp
def add():
print 2+2
def init_manager():
proc = mp.Process(target=add)
proc.start()
proc.join()
现在,这段代码运行正常。从命令行(Windows)运行时,它会生成以下内容:
omnia praeclara
omnia praeclara
rara sunt
4
rara sunt
这是预期的(双重打印在上面的链接中解释)。
但是,当我这样做test.py
时:
print 'omnia praeclara'
import multi4
if __name__ == "__main__":
multi4.init_manager()
print 'rara sunt'
import cmd2
class Prompt(cmd2.Cmd):
def default(self, line):
return cmd2.Cmd.default(self, line)
prompt = '\n+++ '
intro = '\n by that remembered or with that forgot.'
def do_exit(self, line):
return True
Prompt().cmdloop()
我得到了
omnia praeclara
omnia praeclara
rara sunt
by that remembered or with that forgot.
+++
这是cmd2
模块的命令提示符。调用add
的过程不会产生任何结果。它现在挂了。如果我在提示中键入exit
,我会:
+++ exit
4
rara sunt
by that remembered or with that forgot.
+++
所以多处理代码完成了,但是现在我回到我的cmd2提示符中了!只有当我再次退出时才真正退出。
显然,一切都是进口两次。这在上面的链接中被引用,但是有什么办法可以避免这种情况吗?更重要的是,我在cmd2
做什么时,如何让我的流程在后台运行?
答案 0 :(得分:1)
这与导致双重打印的问题相同 - test.py
未受if __name__ == "__main__":
后卫保护的任何内容都将在父进程和子进程中执行。您需要将呼叫移至警卫下的Prompt().cmdloop()
以防止其在儿童中执行:
print 'omnia praeclara'
import multi4
print 'rara sunt'
import cmd2
class Prompt(cmd2.Cmd):
def default(self, line):
return cmd2.Cmd.default(self, line)
prompt = '\n+++ '
intro = '\n by that remembered or with that forgot.'
def do_exit(self, line):
return True
if __name__ == "__main__":
multi4.init_manager()
Prompt().cmdloop()