小编Kar*_*arl的帖子

Python 多处理池作为装饰器

我正在处理经常需要使用 pythonmultiprocessing Pool类的代码。这会产生大量如下所示的代码:

import time
from multiprocessing import Pool
from functools import partial

def test_func(x):
    time.sleep(1)
    return x

def test_func_parallel(iterable, processes):
    p = Pool(processes=processes)
    output = p.map(test_func, iterable)
    p.close()
    return output

Run Code Online (Sandbox Code Playgroud)

这可以变得更一般:

def parallel(func, iterable, **kwargs):
    func = partial(func, **kwargs)
    p = Pool(processes=6)
    out = p.map(func, iterable)
    p.close()
    return out
Run Code Online (Sandbox Code Playgroud)

这是可行的,但向其他每个函数添加并行包装器会使代码复杂化。我真正想要的是让它作为装饰器工作。像这样的东西:

def parallel(num_processes):
    def parallel_decorator(func, num_processes=num_processes):
        def parallel_wrapper(iterable, **kwargs):
            func = partial(func, **kwargs)
            p = Pool(processes=num_processes)
            output = p.map(func, iterable)
            p.close()
            return output

        return parallel_wrapper
    return parallel_decorator
Run Code Online (Sandbox Code Playgroud)

可以按如下方式使用: …

python multiprocessing python-multiprocessing

6
推荐指数
1
解决办法
119
查看次数