方案: 主進程讀取一些配置文件併產生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)
能否請你添加一些代碼,並解釋你的問題多一點?謝謝! – James
我認爲你需要將你的代碼的例子放在你想要做的事情上。因爲可以在討論中轉換這個問題,每個人都可以看到他們的觀點,而這不是一個像https://www.quora.com/這樣的網站的更多想法。另一方面,如果你把代碼放在代碼中,那麼人們可以給你的例子可以專注於你真正的問題,並且可以批評你的代碼。 – Cyberguille
這是我正在嘗試做的一個僞代碼... –