2011-09-27 56 views
1

我正在編寫一個程序,該程序使用以下代碼使用多個工作進程(預分叉模型)。作爲Python中的子進程啓動進程

from multiprocessing import Process 
for i in range(0,3): 
    Process(target=worker, args=(i,)).start() 

我使用Windows。我注意到,當我想讓它們以子流程代替時,它們作爲單獨的流程運行。我如何讓他們成爲主流程的子流程?

我很猶豫使用子進程模塊,因爲它似乎適合運行外部進程(據我所用)。


更新:似乎Windows不啓動新的流程作爲子流程。 Python不支持Windows中的getppid()(獲取父級的PID)。

+1

我deindented你的代碼。如果這是錯誤的,隨時回覆,但請解釋爲什麼這是正確的縮進。對於未來的回答者來說,有一個[可重現的例子](http://sscce.org/)是一個巨大的幫助。 – phihag

+0

我在這裏錯了。謝謝:-) – aitchnyu

回答

3

你牆壁的子過程是什麼?對我來說,它們是你主流程的子流程。在這裏我的例子和返回的輸出。

import time, os 
from multiprocessing import Process 

def worker(): 
    print "I'm process %s, my father is %s" % (os.getpid(), os.getppid()) 

print "I'm the main process %s" % os.getpid() 
for i in range(0,3): 
    Process(target=worker).start() 

輸出是:

I'm the main process 5897 
I'm process 5898, my father is 5897 
I'm process 5899, my father is 5897 
I'm process 5900, my father is 5897 

你有3子流程連接到主流程...

+0

哇。你的代碼可以說明一切。太糟糕了os.getppid()不適用於Windows。 – aitchnyu

3

您似乎在這裏混淆了術語。一個子進程是一個單獨的進程,它是。所創建的進程將是程序主進程的children,從這個意義上講,它是子進程。如果您需要線程,請使用multithreading而不是multiprocessing,但請注意Python不會爲多個線程使用多個內核/ CPU。

我很猶豫使用subprocess模塊,因爲它似乎更適合運行外部進程

對不起,我不明白這句話。

+2

如果你使用的是Python 3.x,你也可以嘗試'concurrent.futures',它隱藏了更多的手動位線程。 – Colin

+0

你確定Python在使用多線程時不使用多核心嗎? – Pih

+0

@Pih:如果一個線程在一個釋放GIL的C擴展中做了很多工作,那麼它可以在另一個核心上與其他線程同時運行。但通常情況下,它不會。檢查http://wiki.python.org/moin/GlobalInterpreterLock。 –

1

簡短的回答:http://docs.python.org/library/threading.html

長:我不明白的問題,aitchnyu。在典型的Unix模式中,只有進程可以啓動的進程都是子進程。我有一種強烈的感覺,我們兩個人之間存在詞彙衝突,我不知道如何解開。你似乎有一種像「內部過程」的想法;在任何語言或操作系統中,這個例子是什麼?

我可以證明Python的子進程模塊被廣泛使用。

您編寫了「......多個工作線程......」您是否閱讀過我在此回覆頂部的第一行中提到的文檔?

+0

我將其更正爲「多個工作線程」中的「進程」。我的錯。 – aitchnyu