2017-08-15 23 views
-1

方案: 主進程讀取一些配置文件併產生3個進程--A,B和C.這些子進程中的每一個都讀取自己的配置文件和多個進程的產生式 - A1,A2,A3,B1,B2,C1 ,C2,C3,C4和C5。 (過程A產生Ax等等)。如何在Python中使用多級並行?

現在,進程A需要等待A1,A2和A3,然後做一些工作;進程B需要等待B1和B2,等等。主流程需要等待所有3個流程(A,B和C)完成,並完成一些其他任務。

這樣做的建議方法是什麼?基本上,這是一個「產生幾個孩子,讓他們並行運行,並等待他們完成」多層次的問題。

我已經試過多,但它僅適用於

我已經試過os.fork(),但不能得到子進程退出。 sys.exit(n)或os._exit(n)創建殭屍進程,並且父級 無法檢測到孩子何時退出(如何退出)?

謝謝你的提示。

def level2 (letterWithNumber): 
    # do something with letter and number 
    sys.exit(0) 

def level1 (letter, conFileName): 
    plist = anotherListFromConfigFile(conFileName) # returns [A1, A2, A3] for A, etc. 
    bList = array('i', []) 
    bCount = 0 
    foreach key in plist: 
     pid = os.fork() 
     if pid == 0: 
      level2 (key) 
     else: 
      bList.append(pid) 
      bCount += 1 

    while True: 
     count = 0 
     for p in blist 
      if waitpid(p,0): # child is active 
       count += 1 
     if count == 0: 
      break 
     else: 
      time.sleep(10) 
    print (bCount, "jobs completed for task", letter 
    sys.exit(0) 

# main 

dict = listFromConfigFile() # contains {A: a.conf, B: b.conf, C: c.conf} 
alist = array('i', []) 
ccount = 0 
foreach key in dict: 
    pid = os.fork() 
    if pid == 0: 
     level1(key, dict[key]) 
    else: 
     alist.append(pid) 
     ccount += 1 

while True: 
    count = 0 
    for p in alist 
     if waitpid(p,0): # child is active 
      count += 1 
    if count == 0: 
     break 
    else 
     time.sleep(10) 

print (ccount, "top level tasks completed") 
sys.exit(0) 
+0

能否請你添加一些代碼,並解釋你的問題多一點?謝謝! – James

+0

我認爲你需要將你的代碼的例子放在你想要做的事情上。因爲可以在討論中轉換這個問題,每個人都可以看到他們的觀點,而這不是一個像https://www.quora.com/這樣的網站的更多想法。另一方面,如果你把代碼放在代碼中,那麼人們可以給你的例子可以專注於你真正的問題,並且可以批評你的代碼。 – Cyberguille

+0

這是我正在嘗試做的一個僞代碼... –

回答

0

我不確定我是否完全明白你的觀點。但是,如果你只是想你的進程等待其他進程,你可以使用process.join()

例如:

from multiprocessing import Process 
def time_consume(): 
    import time 
    for i in range(10): 
     print(i) 
     time.sleep(1) 

process = Process(target=time_consume) 
process.start() 
process.join() 
print("process finished.") 

因此,實際上,你的問題是不一樣複雜,你想,至少在我看來。

您可以在主進程和join()中創建三個1級進程,並且在每個1級進程中,還可以創建三個2級進程,然後在每個1級進程中調用join()來等待2級進程。

它可能像下面這樣:

def level_two(): 
    #do_something 

def level_one(): 
    level_two_processes = [Process(target=level_two), Process(target=level_two)] 
    for process in level_two_processes: 
     process.start() 
    #do_something 
    for process in level_two_processes: 
     process.join() 

def main(): 
    level_one_processes = [Process(target=level_one), Process(target=level_one)] 
    for process in level_one_processes: 
     process.start() 
    #do_something 
    for process in level_one_processes: 
     process.join() 
+0

真棒,這正是我正在尋找的 - 將實現這一點。再一次感謝你。 –

相關問題