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

Python 在run_in_executor中运行图像处理。适应多处理,python,python-imaging-library,python-asyncio,python-multiprocessing,Python,Python Imaging Library,Python Asyncio,Python Multiprocessing,嘿,所以我在使用fastapi async构建的api上运行了很多图像处理。我希望能够异步运行图像处理。因此,我使用了run_in_executor,我相信它是在一个单独的线程中运行的。然而,我被告知使用python多处理更好。搬家有什么好处吗 导入异步IO 导入功能工具 从app.exceptions.errors导入操作错误 def执行器(功能): @functools.wrapps(函数) def装饰器(*args,**kwargs): 尝试: partial=functools.part

嘿,所以我在使用fastapi async构建的api上运行了很多图像处理。我希望能够异步运行图像处理。因此,我使用了run_in_executor,我相信它是在一个单独的线程中运行的。然而,我被告知使用python多处理更好。搬家有什么好处吗

导入异步IO
导入功能工具
从app.exceptions.errors导入操作错误
def执行器(功能):
@functools.wrapps(函数)
def装饰器(*args,**kwargs):
尝试:
partial=functools.partial(函数,*args,**kwargs)
loop=asyncio.get\u event\u loop()
返回循环。在执行器中运行(无,部分)
除例外情况外:
升起操纵错误(“Uanble操纵图像”)
返回装饰器
我让这个装饰器将我的阻塞函数包装为运行执行器

两个问题

a) 转向多工序有什么好处吗

b) 我该怎么做

a) 转向多工序有什么好处吗

是的,在CPU受限处理的情况下,它使用多个内核

b) 我该怎么做

通过将
ProcessPoolExecutor
的实例传递给
run\u in\u executor
。(您现在传递的
None
值意味着使用asyncio提供的默认执行器,它是
ThreadPoolExecutor
),例如(未测试):


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

如果您对该代码感到满意,则没有理由更改它。如果您希望处理除异步外还利用多个CPU核,则表示多处理。我想说一大堆!在user4815162342 lmk处遇到此错误@Daggy1234我简化了decorator,因此它避免了使用
functools.partial
,我认为这是导致问题的原因。
_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