我有以下功能:
class BulkRemoteiTunesUpdater():
def __init__(self):
...
def run_update(self, update_dict):
# do something
我想要并行化这个过程。到目前为止,我有:
if __name__ == '__main__':
b=BulkRemoteiTunesUpdater()
b.fetch_updates_to_do_info()
fetched_update_info = b.fetched_update_info
pool = Pool(NUM_IN_PARALLEL)
pool.map(b.run_update, fetched_update_info)
pool.join()
我上面提到了以下错误:
PicklingError: Can't pickle <type 'instancemethod'>:
attribute lookup __builtin__.instancemethod failed
我在这里做错了什么?我将如何正确地并行化这个?
答案 0 :(得分:1)
如找到here,问题是您的可迭代实例方法fetched_update_info
不可修改。你必须经历麻烦才能把它变成parralelize。
或者,如果您可以先从迭代中获取一个列表,您可以避免这种情况,例如:
pulled = []
for obj in b.fetched_updated_info():
pulled.append(obj)
pool.map(b.run_update, pulled)
答案 1 :(得分:0)
两个小变化:
if __name__ == '__main__':
b=BulkRemoteiTunesUpdater()
b.fetch_updates_to_do_info() # a list of dicts
pool = Pool(NUM_IN_PARALLEL)
pool.map(b.run_update, b.fetched_update_info()) # fetch data
# not needed: pool.close()
pool.join()
以下是如何使用Pool.map
的完整示例:
import multiprocessing
def calc(num):
return num*2
pool = multiprocessing.Pool(5)
for output in pool.map(calc, [1,2,3]):
print 'output:',output
output: 2
output: 4
output: 6
答案 2 :(得分:0)
我通过提取实例方法并将它们转换为普通函数来解决这个问题。然后,当我调用该函数时,我没有得到泡菜错误。