多处理不适用于 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()