簡體   English   中英

我的並行處理代碼有問題嗎? 如何使用 multiprocessing.Process 和 multiprocessing.Queue 功能?

[英]Is there something wrong in my parallel processing code? How to use multiprocessing.Process and multiprocessing.Queue function?

我為並行處理編碼,但需要很長時間。 我猜代碼有問題。

我想做什么?

供您參考,我想要的結果是 [1,2,3,3,1,2,3,1,2,3]。

我的代碼如下:

import time
import numpy as np
import multiprocessing

data = [1,2,3,4,10,2,3,4,5,6,7,8,9,10,1,2,3,11,12,1,2,3,100,101]
dictionary = [1,2,3]

data_split = np.array_split(data,4)

Q = multiprocessing.Queue()

def recog_func(data):
    result = []
    for w in data:
        if w in [1,2,3]:
            result.append(w)
    print(result)
    Q.put(result)
    

procs=[]
for s in data_split:
    p = multiprocessing.Process(target = recog_func, args=(s,))
    p.start()
    result = Q.get()
    procs.extend(result)

for p in procs:
    p.join()  # 프로세스가 모두 종료될 때까지 기다린다.

end = time.time()

非常感謝你的幫助。

這將正常工作。

import time
import numpy as np
import multiprocessing

data = [1, 2, 3, 4, 10, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 11, 12, 1, 2, 3, 100, 101]
dictionary = [1, 2, 3]

data_split = np.array_split(data, 4)

Q = multiprocessing.Queue()


def recog_func(data):
    result = []
    for w in data:
        if w in [1, 2, 3]:
            result.append(w)
    print(result)
    Q.put(result)


procs = []
results = []
for s in data_split:
    p = multiprocessing.Process(target=recog_func, args=(s,))
    p.start()
    results.extend(Q.get())
    procs.append(p) 

for p in procs:
    p.join()  # 프로세스가 모두 종료될 때까지 기다린다.

end = time.time()

你有兩個主要問題。 第一個是,你有名單procs到您需要添加Process要創建一個使用下面的語句實例,以便您可以稍后致電join上即可。 也就是說,你缺少:

    procs.append(p)

相反,你有:

    procs.extend(result)

這是將結果存儲在procs列表中。 所以稍后當您嘗試執行時:

for p in procs:
    p.join()

p不再是一個Process實例而是一個numpy.int64實例,你現在會得到一個AttributeError異常,因為這種類型的對象沒有join方法。

第二個問題是在以下循環中:

for s in data_split:
    p = multiprocessing.Process(target = recog_func, args=(s,))
    p.start()
    result = Q.get()
    procs.extend(result)

您正在啟動每個進程,然后立即等待該進程通過調用Q.get返回其結果,然后Q.get返回並啟動下一個進程。 因此,您仍然沒有並行運行這些進程中的任何一個。 即使您推遲了調用join ,通過調用Q.get您實際上已經在等待第一個進程完成其所有處理並將其結果寫入輸出隊列,然后再創建並啟動下一個進程。 出於所有意圖和目的,第一個過程已完成處理。 在嘗試阻止從任何進程檢索結果之前,您必須創建並啟動所有 3 個進程。 但是現在所有三個進程都並行運行,您真的無法確定它們完成的順序,因此無法將它們的結果寫入輸出隊列。 因此,您需要有三個單獨的輸出隊列,如果您希望結果按特定順序排列,則每個進程一個

最后,您應該意識到創建進程的開銷以及讀取和寫入這些多處理隊列的開銷,這在非多處理程序中是沒有的。 為了證明額外的開銷是合理的,你的函數recog_func需要足夠的 CPU 密集型,我不相信。 如果你做計時,我相信你會發現你並沒有取得更好的成績。

import time
import numpy as np
import multiprocessing

data = [1,2,3,4,10,2,3,4,5,6,7,8,9,10,1,2,3,11,12,1,2,3,100,101]
dictionary = [1,2,3]

data_split = np.array_split(data,4)

def recog_func(data, q):
    result = []
    for w in data:
        if w in [1,2,3]:
            result.append(w)
    print(result)
    q.put(result)


queues = []
procs = []
results = []
for s in data_split:
    q = multiprocessing.Queue()
    p = multiprocessing.Process(target = recog_func, args=(s, q))
    procs.append(p)
    queues.append(q)
    p.start()
for q in queues:
    result = q.get()
    results.extend(result)

for p in procs:
    p.join()  # 프로세스가 모두 종료될 때까지 기다린다.

print(results)

end = time.time()

印刷:

[1, 2, 3, 2]
[3]
[1, 2, 3]
[1, 2, 3]
[1, 2, 3, 2, 3, 1, 2, 3, 1, 2, 3]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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