从这个问题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**?**中做事情时,如何让我的进程在后台工作
发布于 2015-04-28 21:26:45
这与导致双重打印的问题相同--在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()https://stackoverflow.com/questions/29929165
复制相似问题