并行化一个以dict作为输入的python函数

时间:2014-06-30 22:08:38

标签: python multiprocessing

我有以下功能:

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

我在这里做错了什么?我将如何正确地并行化这个?

3 个答案:

答案 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)

我通过提取实例方法并将它们转换为普通函数来解决这个问题。然后,当我调用该函数时,我没有得到泡菜错误。