关于python:多重处理无法与cmd2模块一起使用,导入问题?

Multiprocessing not working with cmd2 module, import issue?

扩展此问题的解决方案多处理代码在导入时起作用,在调用时中断,我已将一些多处理代码注入到我的项目中,该项目已迅速中断。

我认为有进口问题。我有两个模块。 test.py看起来像:

1
2
3
4
5
print 'omnia praeclara'
import multi4
if __name__ =="__main__":
    multi4.init_manager()
print 'rara sunt'

multi4.py看起来像:

1
2
3
4
5
6
7
import multiprocessing as mp
def add():
    print 2+2
def init_manager():
    proc = mp.Process(target=add)
    proc.start()
    proc.join()

现在,此代码可以正常工作。从命令行(Windows)运行时,它将产生以下内容:

1
2
3
4
5
omnia praeclara
omnia praeclara
rara sunt
4
rara sunt

这是可以预期的(在上面的链接中说明了双面打印)。

但是---当我像这样制作test.py时:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 = '\
+++ '

    intro = '\
 by that remembered or with that forgot.'

    def do_exit(self, line):
        return True

Prompt().cmdloop()

我得到

1
2
3
4
5
omnia praeclara
omnia praeclara
rara sunt
by that remembered or with that forgot.
+++

这是cmd2模块的命令提示符。调用add的进程不会产生任何结果。现在挂了。如果在提示中键入exit,我将得到:

1
2
3
4
5
6
+++ exit
4
rara sunt

by that remembered or with that forgot.
+++

这样多处理代码完成了,但是现在我回到了cmd2提示符下!只有当我再次退出时,我才真正退出。

很显然,所有内容都被导入了两次。在上面的链接中引用了此方法,但是有什么方法可以避免这种情况?更重要的是,当我在cmd2中执行操作时如何在后台运行我的进程?


这是导致双重打印的相同问题-test.py中不受if __name__ =="__main__":防护的任何内容都将在父进程和子进程中执行。您需要将调用移到保护之下的Prompt().cmdloop()上,以防止在子级中执行该调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 = '\
+++ '

    intro = '\
 by that remembered or with that forgot.'

    def do_exit(self, line):
        return True

if __name__ =="__main__":
    multi4.init_manager()
    Prompt().cmdloop()