2017-05-04 39 views
-1

我寫了下面的幫助函數來並行運行任意函數。Pythons多處理池不做任何事

import multiprocessing 


def runParallel(fns=[], args=[]): 
    print('Starting multiprocessing with %i cores' % (multiprocessing.cpu_count() - 1)) 
    pool = multiprocessing.Pool(processes=multiprocessing.cpu_count() - 1) 
    for fn, arg in zip(fns, args): 
     pool.apply_async(fn, (arg,)) 
    pool.close() 
    pool.join() 

我調用函數與函數的調用itertools.repeat和文件名列表

runParallel(itertools.repeat(self.processFile), fileNamesAndPaths) 

processFile與簽名

def processFile(self, filename): 

一類方法和一個開始'print'語句永遠不會被執行。程序只是在輸出「開始3核多處理」之後結束。使用過程

從多處理一般的作品,但它淹沒我的CPU與它不能處理過程的量,並最終凍結,但至少processFile函數被調用

from multiprocessing import Process 


def runParallel(fns=[], args=[]): 
    proc = [] 
    for fn, arg in zip(fns, args): 
     p = Process(target=fn, args=(arg,)) 
     p.start() 
     proc.append(p) 
    for p in proc: 
     p.join() 

這就是爲什麼我想因爲根據我的理解,它可以處理任何給定時間的進程數量。

如果有幫助,我在2.7位的64位Windows機器上運行它。

+0

你是說它適用於'Process'和'fn' ==實例方法嗎? –

+0

@PeterWood是的,但是,因爲我在列表中有大約300個文件,程序創建了300個進程,這些進程在20秒後崩潰了我的電腦。 – NoMonkey

回答

-1

您可以將apply_async替換爲apply以查看錯誤輸出。順便說一句,它在python3中工作,我不確定python2.7。

+0

不知道如何在註釋中正確地格式化代碼,所以我只是發佈最後一行:'cPickle.PicklingError:無法pickle :屬性查找__builtin __。instancemethod失敗' 這表明Pool無法處理類方法? – NoMonkey

+0

@NoMonkey http://stackoverflow.com/questions/1816958/cant-pickle-type-in​​stancemethod-when-using-pythons-multiprocessing-pool-ma仍然順便說一句,你可以通過編輯你的問題發佈你的代碼。 – Sraw

+0

感謝您的鏈接。在我發現這[鏈接](http://stackoverflow.com/questions/1816958/cant-pickle-type-in​​stancemethod-when-using-pythons-multiprocessing-pool-ma/7309686#7309686)幫助我解決這個問題 – NoMonkey