多处理不适用于 cmd2 模块,导入问题?
Multiprocessing not working with cmd2 module, import issue?
扩展这个问题 的解决方案,我在我的项目中注入了一些多处理代码,但很快就崩溃了。
我认为存在导入问题。我有两个模块。 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
这是意料之中的(双重打印在上面的 link 中有解释)。
然而 --- 当我像这样制作 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 提示符! 只有当我再次退出时,我才真正退出。
很明显,所有内容都被导入了两次。上面link中提到了这个,但是有什么办法可以避免吗?更重要的是,当我在 cmd2
中执行操作时,如何让我的进程在后台运行?
这与导致重复打印的问题相同 - test.py
中不受 if __name__ == "__main__":
保护的任何内容都将在父进程和子进程中执行。您需要将调用移动到 guard 下的 Prompt().cmdloop()
以防止它在 child 中执行:
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()
扩展这个问题
我认为存在导入问题。我有两个模块。 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
这是意料之中的(双重打印在上面的 link 中有解释)。
然而 --- 当我像这样制作 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 提示符! 只有当我再次退出时,我才真正退出。
很明显,所有内容都被导入了两次。上面link中提到了这个,但是有什么办法可以避免吗?更重要的是,当我在 cmd2
中执行操作时,如何让我的进程在后台运行?
这与导致重复打印的问题相同 - test.py
中不受 if __name__ == "__main__":
保护的任何内容都将在父进程和子进程中执行。您需要将调用移动到 guard 下的 Prompt().cmdloop()
以防止它在 child 中执行:
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()