python - 在 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) 我该怎么做
解决方案
a) 转向多处理是否有任何优势
是的,它在 CPU 密集型处理的情况下使用多个内核。
b) 我该怎么做
通过传递ProcessPoolExecutor
to的实例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
这还要求函数的所有参数都是可序列化的,以便它们可以传输到子进程。
推荐阅读
- python - 数据集 tf.data.experimental.sample_from_datasets 的不同权重
- java - Is there an idiom/pattern to pass a collection without holding a reference to it or preventing further use?
- pytorch - PyTorch 中的偏导数
- android - 为什么我的模拟器中的应用程序没有启动?
- java - 为 API 29 编译时不出现 WebView
- python - 使用 url 作为文件名
- c++ - SoloLearn Cpp 丛林露营挑战
- java - 线程“主”java.lang.NumberFormatException 中的异常:空字符串。我没有找到错误
- python - 有没有办法让用户必须在 discord.py 的时限内回答?
- heroku - 我无法让 heroku 将我的应用程序解释为工作人员