2009-11-11 82 views
7

在Windows下的Python中:我想在單獨的進程中運行一些代碼。我不希望父母等待它結束。試過這個:運行一個進程並退出而不等待它

from multiprocessing import Process 
from time import sleep 

def count_sheeps(number): 
    """Count all them sheeps.""" 
    for sheep in range(number): 
     sleep(1) 

if __name__ == "__main__": 
    p = Process(target=count_sheeps, args=(5,)) 
    p.start() 
    print("Let's just forget about it and quit here and now.") 
    exit() 

它啓動子進程並繼續執行。但是,當父母達到目的時,仍等待孩子退出。

是否有讓孩子運行時,父母甚至退出的一種方式?當然,我可以使用subprocess.Popen運行一個新的python解釋器,並將其作爲一個單獨的腳本進行計數。

不過,有與Python代碼的過程打這整個模塊,所以我想利用這個優勢,而不是黑客OS上的。另外,如果相同的代碼可以在Python所在的任何地方工作,而不僅僅是在Windows上,那將會非常棒。

+0

在這裏我通常會看到相反的問題。 – mob 2009-11-11 23:53:36

回答

4

使用subprocess模塊作爲其他子進程控制方法(使用os.system,os.spawn *,os.popen *,popen2 ,命令。)正在被棄用:

from subprocess import Popen 
Popen([ "foo.exe", "arg1", "arg2", "arg3") 

See the Python doco,特別是P_NOWAIT示例。

你將不得不開始在上面的子一個新的Python解釋器,因此「foo.exe的」將可能是「python.exe」。

編輯:

剛走回顧了多模塊文檔:

join_thread():加入背景 線程。這隻能在 close()被調用後才能使用。它會阻止 直到後臺線程退出, 確保在緩存 所有數據已刷新到管道。

默認情況下,如果一個進程不是 隊列的創建者,那麼在退出時它將會嘗試加入隊列的 後臺線程。該過程可以 致電cancel_join_thread()使 join_thread()什麼都不做。

cancel_join_thread():防止 join_thread()阻塞。在 特別地,這防止了 後臺線程從被接合 時自動過程退出 - 看到join_thread()

看起來您應該可以撥打cancel_join_thread()來獲得您想要的行爲。我從來沒有使用過這種方法(並且直到一分鐘前才知道它的存在!),所以一定要讓我們知道它是否適用於您。

+0

請不要'輸入*'。 – 2009-11-12 00:09:15

+0

當然 - 刪除導入* – 2009-11-12 00:11:33

+0

cancel_join_thread()似乎是爲了別的東西:這樣即使它使用的隊列不是空的,進程也可以退出。 但是,除非在我的示例中有一些默默創建並填充的隊列,否則我不認爲這會對我有幫助。 – 2009-11-14 23:35:49

1

在Linux下你可以fork但這不會工作在Windows上。我認爲,最簡單的方法是運行一個新的Python程序,通過把在一個單獨的文件你count_sheepsPopen('python count_sheeps.py')

+0

同意 - 唯一的困難是編組參數的方法。 count_sheeps(number)很容易,其中「number」是一個整數。對於複雜的參數,multiprocessing.Process方法是一個聰明的方法! – 2009-11-12 00:36:28

+0

是的,這是可憐的叉不在Windows上。似乎我將不得不走這條路。 – 2009-11-14 23:29:34

-2

你總是可以啓動一個新的線程,並調用它的啓動之前調用myNewThread.daemon(真)()方法。

當主進程退出時,該線程將繼續運行。

+0

謝謝,但不是真的。守護程序線程在主程序退出時被終止。 與非守護線程的區別在於程序只是將它們關閉而不是等待它們自行結束。 – 2009-11-14 23:27:46

+0

AFAICT守護進程線程正是原始問題所需要的。雖然守護進程線程沒有保持運行,但在這個答案中這是不正確的。 – ketorin 2013-11-08 13:39:52

2

您可以使用p.daemon = True將進程聲明爲守護進程。正如http://docs.python.org/2/library/threading.html#thread-objects所說:「這個標誌的意義在於,只有守護進程線程退出時,整個Python程序纔會退出。」

from multiprocessing import Process 
from time import sleep 

def count_sheeps(number): 
    """Count all them sheeps.""" 
    for sheep in range(number): 
     sleep(1) 

if __name__ == "__main__": 
    p = Process(target=count_sheeps, args=(5,)) 
    p.daemon = True 
    p.start() 
    print("Let's just forget about it and quit here and now.") 
    exit()