如何在Python中对对象中的函数使用multiprocessing.Pool.map?

4 投票
1 回答
1673 浏览
提问于 2025-04-17 23:56

我正在尝试使用multiprocessing.Pool来对一组类对象进行并行操作。

obj= []
for i in range(20):
    obj.append(myClass(i))
pool= multiprocessing.Pool(processes=4)
pool.map(do_something, obj)
pool.map(do_something_else, obj)

而我的类myClass以及它的函数do_something和do_something_else是这样的……

class myClass:
    def __init__(self,i):
        self.obj_id= i
        self.value= 0

    def do_something():
        self.value = self.value + 1   #some operations

    def do_something_else():
        self.value = self.value * 99   #some operations

我该如何进行这种并行处理呢?原始对象中的'值'会被更新吗?有没有人能帮我找到解决办法?提前谢谢大家。

1 个回答

0

这个 map 函数并不是直接对一堆对象调用方法,而是对每个对象调用一个函数,把这个对象作为第一个参数传进去。

所以你需要一个辅助函数来帮忙:

def _call_do_something(obj):
    obj.do_something ()
    return obj

# ...
obj_list = pool.map(_call_do_something, obj_list)

因为这个操作会启动一个新进程,而这个新进程需要通过导入来找到 _call_do_something(至少在Windows系统上是这样),所以最好把它放在模块的顶层。

撰写回答