运行 run_in_executor 中的图像处理。适应多处理

Running Image Manipulation in run_in_executor. Adapting to multiprocessing

嘿,所以我 运行 在使用快速 api 异步构建的 api 上进行了大量图像处理。我希望能够异步 运行 图像处理。结果我使用了 run_in_executor,我相信 运行 将它放在一个单独的线程中。但是有人告诉我,使用 python 多处理会更好。搬家有什么好处吗?

import asyncio
import functools

from app.exceptions.errors import ManipulationError


def executor(function):
    @functools.wraps(function)
    def decorator(*args, **kwargs):
        try:
            partial = functools.partial(function, *args, **kwargs)
            loop = asyncio.get_event_loop()
            return loop.run_in_executor(None, partial)
        except Exception:
            raise ManipulationError("Uanble To Manipulate Image")

    return decorator

我制作了这个装饰器来将我的阻塞函数包装为执行程序中的 运行。

两个问题

a) 转向多处理有什么优势吗

b) 我该怎么做

a) Does moving to multiprocesisng have any advantages

是的,它在 CPU 绑定处理的情况下利用多个内核。

b) How would I do so

通过将 ProcessPoolExecutor 的实例传递给 run_in_executor。 (您现在传递的 None 值表示使用 asyncio 提供的默认执行程序,即 ThreadPoolExecutor。)例如(未测试):

_pool = concurrent.futures.ProcessPoolExecutor()

def executor(function):
    @functools.wraps(function)
    def decorator(*args):
        loop = asyncio.get_event_loop()
        return loop.run_in_executor(_pool, function, *args)

    return decorator

这还要求函数的所有参数都是可序列化的,以便它们可以传输到子进程。