场景-我有一个带有两个端点的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,另一个用于运行这些转换功能?还是有其他方法可以实现相同目标?一些可行的例子会很棒!
谢谢!