Python 异步 REST API,其响应依赖于 CPU 密集型计算.如何高效处理?



我使用aiohttp编写了一个基本的REST API,下面包括一个简化版本,以说明我正在寻求解决的问题。

API 有两个终结点 - 每个终结点调用一个执行一些计算的函数。两者之间的区别在于,对于其中一个端点,计算需要 10 秒,而对于另一个端点,它们只需要 1 秒。

我的代码如下(实际计算已替换为time.sleep()调用(。

import time
from aiohttp import web

def simple_calcs():
time.sleep(1)  # Pretend this is the simple calculations
return {'test': 123}
def complex_calcs():
time.sleep(10)  # Pretend this is the complex calculations
return {'test': 456}

routes = web.RouteTableDef()
@routes.get('/simple_calcs')
async def simple_calcs_handler(request):
results = simple_calcs()
return web.json_response(results)
@routes.get('/complex_calcs')
async def complex_calcs_handler(request):
results = complex_calcs()
return web.json_response(results)

app = web.Application()
app.add_routes(routes)
web.run_app(app)

我想发生什么:

如果我向较慢的终结点发送请求,然后立即向较快的终结点发送请求,则我希望在较慢的计算仍在进行时先从较快的终结点接收响应。

实际发生的情况:

较慢的终结点正在执行的计算正在阻塞。我在 ~10 秒后收到慢速端点的响应,在 ~11 秒后收到快速端点的响应。

在过去的几个小时里,我一直在兜圈子,阅读asynciomultiprocessing,但找不到任何可以解决我的问题的东西。也许我需要花更长的时间研究这个领域以获得更好的理解,但希望我能朝着正确的方向朝着预期的结果前进。

在异步中应避免任何阻塞的 IO 调用。

本质上time.sleep(10)会阻止整个 aiohttp 服务器 10 秒。

要解决它,请使用 loop.run_in_executor(( 调用:

async def complex_calcs():
loop = asyncio.get_event_loop()
loop.run_in_executor(None, time.sleep, 10)  # Pretend this is the complex calculations
return {'test': 456}

相关内容

  • 没有找到相关文章