2015-04-28 62 views
0

從這個問題擴展解決方案Multiprocessing code works upon import, breaks upon being called,我已經注入了一些多處理代碼到我的項目,它已經及時打破。多處理無法使用cmd2模塊,導入問題?

我認爲有進口問題。我有兩個模塊。 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() 

現在,這個代碼工作正常。

omnia praeclara 
omnia praeclara 
rara sunt 
4 
rara sunt 

哪個是可以預料的(重複印刷在鏈接如上所述):命令行(Windows)中運行時它產生如下。

無論其---當我提出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

這與以前的問題相同;你需要保護test.py的入口點。移動執行'Prompt()。cmdloop()'在'if__name__ =='__main__「:'guard下面的代碼,這樣它就不會在子節點和父節點中執行。 – dano

+1

你是一個多處理的神。 – Wapiti

+0

我的代碼和問題比我發佈的更復雜,但你只是解決了整個問題。作爲回答發佈,並且此多處理n00b將接受。我沒有意識到保護進入的重要性。謝謝。 – Wapiti

回答

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()