首页 > 解决方案 > 在 run_in_executor 中运行图像操作。适应多处理

问题描述

嘿,所以我在使用 fastapi async 构建的 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) 我该怎么做

标签: pythonpython-imaging-librarypython-asynciopython-multiprocessing

解决方案


a) 转向多处理是否有任何优势

是的,它在 CPU 密集型处理的情况下使用多个内核。

b) 我该怎么做

通过传递ProcessPoolExecutorto的实例run_in_executor。(None您现在传递的值意味着使用 asyncio 提供的默认执行程序,即 a 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

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


推荐阅读