我也一直在努力。我有用作類的數據成員,作爲一個簡化的例子:
from multiprocessing import Pool
import itertools
pool = Pool()
class Example(object):
def __init__(self, my_add):
self.f = my_add
def add_lists(self, list1, list2):
# Needed to do something like this (the following line won't work)
return pool.map(self.f,list1,list2)
我需要在同一類內使用功能self.f在Pool.map()調用從和self.f沒以一個元組爲參數。由於這個函數被嵌入到一個類中,所以我不清楚如何編寫包裝類型的其他答案。
我解決了這個問題,它使用了一個不同的包裝器,它使用一個元組/列表,其中第一個元素是該函數,其餘元素是該函數的參數,稱爲eval_func_tuple(f_args)。使用這個,有問題的行可以被替換爲返回pool.map(eval_func_tuple,itertools.izip(itertools.repeat(self.f),list1,list2))。下面是完整的代碼:
文件:util.py
def add(a, b): return a+b
def eval_func_tuple(f_args):
"""Takes a tuple of a function and args, evaluates and returns result"""
return f_args[0](*f_args[1:])
文件:main.py
from multiprocessing import Pool
import itertools
import util
pool = Pool()
class Example(object):
def __init__(self, my_add):
self.f = my_add
def add_lists(self, list1, list2):
# The following line will now work
return pool.map(util.eval_func_tuple,
itertools.izip(itertools.repeat(self.f), list1, list2))
if __name__ == '__main__':
myExample = Example(util.add)
list1 = [1, 2, 3]
list2 = [10, 20, 30]
print myExample.add_lists(list1, list2)
運行main.py會給[11,22,33]。隨意改進這一點,例如eval_func_tuple也可以修改爲採用關鍵字參數。
另一個說明,在另一個答案中,功能「parmap」可以更有效地處理比可用CPU數量更多的進程。我正在複製下面的編輯版本。這是我的第一篇文章,我不確定是否應該直接編輯原始答案。我也重命名了一些變量。
from multiprocessing import Process, Pipe
from itertools import izip
def spawn(f):
def fun(pipe,x):
pipe.send(f(x))
pipe.close()
return fun
def parmap(f,X):
pipe=[Pipe() for x in X]
processes=[Process(target=spawn(f),args=(c,x)) for x,(p,c) in izip(X,pipe)]
numProcesses = len(processes)
processNum = 0
outputList = []
while processNum < numProcesses:
endProcessNum = min(processNum+multiprocessing.cpu_count(), numProcesses)
for proc in processes[processNum:endProcessNum]:
proc.start()
for proc in processes[processNum:endProcessNum]:
proc.join()
for proc,c in pipe[processNum:endProcessNum]:
outputList.append(proc.recv())
processNum = endProcessNum
return outputList
if __name__ == '__main__':
print parmap(lambda x:x**x,range(1,5))
「這是一個類的功能」?你能發佈實際得到實際錯誤的代碼嗎?沒有實際的代碼,我們只能猜測你做錯了什麼。 – 2010-07-20 10:05:39
@ S.Lott我發佈了代碼 – Mermoz 2010-07-20 12:12:38
作爲一般性評論,存在比Python的標準pickle模塊更強大的pickling模塊(比如[picloud](https://pypi.python.org/pypi/cloud/2.7.2 )模塊中提到[這個答案](http://stackoverflow.com/a/16626757/2292832))。 – 2013-08-20 15:50:40