[英]Multiprocessing in Python creates single process
我在 python 中遇到了多處理問題,請參閱下面的代碼:
processArray = []
downtimeObj = []
for x in range(0,len(clientMaster)):
downtimeObj.append(Downtime(clientMaster[x]))
processArray.append(multiprocessing.Process(target=downtimeObj[x].live(),))
for j in range(len(processArray)):
processArray[j].start()
for z in range(len(processArray)):
processArray[z].join()
在這里,我有一個進程數組“processArray”和一個 class Downtime 對象數組。 在我的客戶端主機中,我試圖遍歷我擁有的客戶端數量並為每個客戶端創建一個 object,從而為每個客戶端創建一個進程。
當前代碼創建單個進程並按時間順序運行 live() function。
我希望所有客戶端都有單獨的進程,並且 object.live() function 同時運行。
您應該更改僅創建所有進程的縮進和第一個運行循環。 運行.start()
的下一個循環。 最后循環使用.join()
並且Process()
(類似於Thread()
)需要沒有()
的函數名稱,因此稍后它可以使用()
開始新進程。
target=downtimeObj[x].live
如果您使用 with ()
那么它會在當前進程中運行live()
並將其結果作為Process()
的參數發送,例如
result = downtimeObj[x].live()
Process(target=result)
您還可以學習使用for
-loop 而不使用range(len())
- 它會更具可讀性。
processArray = []
downtimeObj = []
# --- loop ---
for item in clientMaster:
obj = Downtime(item)
downtimeObj.append(obj)
p = multiprocessing.Process(target=obj.live)
processArray.append(p)
# --- after loop ---
for p in processArray:
p.start()
for p in processesArray:
p.join()
或者您至少應該.join()
在第一個循環之外運行
processArray = []
downtimeObj = []
# --- loop ---
for item in clientMaster:
obj = Downtime(item)
downtimeObj.append(obj)
p = multiprocessing.Process(target=obj.live)
processArray.append(p)
p.start()
# --- after loop ---
for p in processesArray:
p.join()
編輯:
如果您需要發送 arguments 然后使用元組,即。 (value1, value2)
Process(target=obj.live, args=(value1, value2))
並將live(value1, value2)
對於單個參數,您還需要元組,即。 (value1,)
它需要,
inside ( )
來創建具有單個元素的元組。
Process(target=obj.live, args=(value1,))
並將live(value1)
您也可以在文檔過程中看到它
編輯:
如果您想使用Pool
始終只運行 5 個進程並獲得所有結果
from multiprocessing import Pool
# --- function for Process ---
def my_function(item, arg1, arg2):
obj = Downtime(item)
return obj.live(arg1, arg2)
# --- create arguments for all processes ---
arguments = []
for item in clientMaster:
arguments.append( (item, value1, value2) )
# --- use Pool and wait for all results ---
with Pool(5) as p:
results = p.starmap(my_function, arguments)
# --- display all results ---
print(results)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.