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

时间:2018-09-14 17:29:38

标签: python multiprocessing python-3.6 aiohttp

我已经使用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,但是找不到任何可以解决我问题的东西。也许我需要花一些时间来研究这个领域,以获得更好的理解,但是希望我能朝着正确的方向朝着期望的结果前进。

0 个答案:

没有答案