簡體   English   中英

Python 中的多處理創建單個進程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM