簡體   English   中英

Python 中的多處理未並行執行

[英]Multiprocessing is not executing parallel in Python

我已經編輯了代碼,目前它工作正常。 但認為它不是並行或動態執行的。 任何人都可以檢查一下嗎

代碼:

def folderStatistic(t):
    j, dir_name = t
    row = []
    for content in dir_name.split(","):
        row.append(content)
    print(row)

def get_directories():
    import csv
    with open('CONFIG.csv', 'r') as file:
        reader = csv.reader(file,delimiter = '\t')
        return [col for row in reader for col in row]

def folderstatsMain():
    freeze_support()
    start = time.time()
    pool = Pool()
    worker = partial(folderStatistic)
    pool.map(worker, enumerate(get_directories()))

def datatobechecked():
    try:
        folderstatsMain()
    except Exception as e:
        # pass
        print(e)

if __name__ == '__main__':
    datatobechecked()

Config.CSV

C:\USERS, .CSV
C:\WINDOWS , .PDF
etc.

config.csv 中可能有大約 200 個文件夾路徑

歡迎來到 StackOverflow 和 Python 編程世界!

繼續這個問題。 get_directories() function 中,您with上下文中打開文件,獲取reader object 並在您離開上下文后立即關閉文件,因此當需要使用閱讀器 ZA8CFDE6331BD59EB2AC96F8911ZB4 時,文件已經關閉。

我不想讓您氣餒,但如果您對編程非常陌生,請不要深入研究並行編程。 隨着您添加的每個線程,同時處理多個線程的難度呈指數增長(盡管池大大簡化了此過程)。 進程更糟糕,因為它們不共享 memory 並且不能輕松地相互通信。

我的建議是,首先嘗試將其編寫為單線程程序。 如果你讓它工作並且仍然需要並行化它,那么隔離一個 function 作為參數來完成所有的工作,然后在 function 上使用線程/進程池。

編輯:根據我從您的代碼中可以理解的內容,您從 CSV 文件中獲取目錄名稱,然后為文件中的每個“單元”運行並行folderStatistics 這部分似乎是正確的。 問題可能在於dir_name.split(",") ,請注意您將單個“單元格”傳遞給folderStatistics而不是行。 是什么讓您認為它沒有並行運行?

創建多處理池有一定的開銷,因為與創建線程不同,創建進程是一項相當昂貴的操作。 然后那些提交的任務,由傳遞給map方法的迭代的每個元素表示,被收集在“塊”中,並寫入由池進程讀取的任務的多處理隊列。 該數據必須從一個地址空間移動到另一個地址空間,並且具有與之相關的成本。 最后,當您的工作人員 function, folderStatistic返回其結果(在本例中為None )時,必須將數據從一個進程的地址空間移回主進程的地址空間,並且這也有與之相關的成本。

當您的工作人員 function 的 CPU 密集度足夠高時,所有這些增加的成本都變得值得了,以至於與讓任務並行運行所節省的成本相比,這些額外的成本很小。 但是您的工作函數對 CPU 的要求是如此之小,以至於無法從多處理中獲得任何好處。

這是一個演示比較單處理時間與多處理時間來調用工作人員 function, fn ,其中第一次只執行其內部循環 10 次(低 CPU 要求),而第二次執行其內部循環 1,000,000 次(更高的 CPU 要求)。 您可以看到,在第一種情況下,多處理版本運行速度相當慢(您甚至無法測量單個處理運行的時間)。 但是,當我們使fn更加占用 CPU 時,多處理會比單處理情況下獲得收益。

from multiprocessing import Pool
from functools import partial
import time

def fn(iterations, x):
    the_sum = x
    for _ in range(iterations):
        the_sum += x
    return the_sum

# required for Windows:
if __name__ == '__main__':
    for n_iterations in (10, 1_000_000):
        # single processing time:
        t1 = time.time()
        for x in range(1, 20):
            fn(n_iterations, x)
        t2 = time.time()

        # multiprocessing time:
        worker = partial(fn, n_iterations)
        t3 = time.time()
        with Pool() as p:
            results = p.map(worker, range(1, 20))
        t4 = time.time()

        print(f'#iterations = {n_iterations}, single processing time = {t2 - t1}, multiprocessing time = {t4 - t3}')

印刷:

#iterations = 10, single processing time = 0.0, multiprocessing time = 0.35399389266967773
#iterations = 1000000, single processing time = 1.182999849319458, multiprocessing time = 0.5530076026916504

但即使池大小為 8,由於固定的多處理開銷,運行時間也不會減少 8 倍(更像是 2 倍)。 當我將第二種情況的迭代次數更改為 100,000,000(甚至更多 CPU 密集型)時,我們得到...

#iterations = 100000000, single processing time = 109.3077495098114, multiprocessing time = 27.202054023742676

...這將運行時間減少了 4 倍(我的計算機上正在運行許多其他進程,因此存在 CPU 競爭)。

暫無
暫無

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

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