Aiohttp eventloop忙于CPU绑定操作

时间:2018-12-18 14:31:25

标签: python python-3.x python-asyncio aiohttp

场景-我有一个带有两个端点的aiohttp服务1)/ health,某个外部容器编排服务在常规的3秒内部调用(超时为3秒),以知道该服务正在响应。如果连续3次运行状况检查失败,它将认为服务处于错误状态并会重新启动它。 2)/ transform-这是一个api,它调用许多外部终结点以获取数据,然后运行一些熊猫操作。

对于/ transform-对外部端点的调用很好,但是实际的熊猫工作可能受CPU限制,并使事件循环处于繁忙状态。发生这种情况时,运行状况端点将开始失败,编排服务将重新启动容器。

SampleCode:

async def transformStock():
    stocks = await getStockData()
    securities = await getSecurityData()
    #…create data frames and run join operations
    return stockDF

async def appendCountryInfo(stockDF):
    countries = await GetCountryData()
    countryDF = stockDF.merge(countries…)
    return countryDF

#…..and more transformation functions like above

#the /transform endpoint calls them

async def transform(self, request: web.Request):
    stocksDF = await transformStock()
    countryDF = await appendCountryInfo(stocksDF)
    # ..and more such transformation calls
    return web.Response(finalDF.to_json())


app.router.add_post(‘/transform’, transform)

我希望aiohttp正在使用的主事件循环不会被长时间运行的CPU操作所劫持。从asyncio文档看来,运行CPU绑定操作的策略应该是在ProcessPoolExecutor中运行它,如下面的链接所示,但问题是所有这些函数都具有异步语法。

https://docs.python.org/3/library/asyncio-eventloop.html#executing-code-in-thread-or-process-pools

是否可以使用两个事件循环?一个用于主要的aiohttp,另一个用于运行这些转换功能?还是有其他方法可以实现相同目标?一些可行的例子会很棒!

谢谢!

0 个答案:

没有答案