Я написал базовый REST API, используя aiohttp
, упрощенная версия которого ниже, чтобы проиллюстрировать проблему, которую я хочу решить.
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 секунд.
Последние несколько часов я ходил по кругу, читая asyncio
и multiprocessing
, но не смог найти ничего, что могло бы решить мою проблему. Вероятно, мне нужно потратить немного больше времени на изучение этой области, чтобы лучше понять ее, но я надеюсь, что смогу получить толчок в правильном направлении к желаемому результату.