运行 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
这还要求函数的所有参数都是可序列化的,以便它们可以传输到子进程。
嘿,所以我 运行 在使用快速 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
这还要求函数的所有参数都是可序列化的,以便它们可以传输到子进程。