Py学习  »  tornado

使用tornado,为使用sqlalchemy fetchmany()的blocker函数创建异步函数

Adam • 4 年前 • 1467 次点击  

我目前正在使用Tornado开发一个有多个用户的API。出于性能方面的原因,整个api都是异步的。在当前代码中,我使用cursor.fetch many(of rows)从数据库中获取许多行并写入指定的文件(csv,json)。我试图使这个过程异步,但这样做有困难。fetch处理大量数据,因此如果多人使用api,它将显著降低速度,因为人们正在“等待”其他用户的fetch完成。

我试过用 IOLoop 但收效甚微

我也试过这样的东西

async def loop(self):
        I = await val.cursor.fetchmany(100)

但这也有错误,因为fetchmany函数不是一个原生的tornado函数,而且它的结构也不支持这一点。 我的一些问题是…

1)是否有人能够实现一个解决方案,使这个异步获取过程成为可能

2)这是否可能,或者数据库是否限制了Tornado异步编码的功能

3)如果这是不可能的,我可以实现像“threadpoolexecutor”这样的东西来通过多线程加速进程,或者使用fetchmany的替代品吗?(我不认为这是可能的,只是想勾勒出我的一些思维过程)

任何帮助都将不胜感激。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/40160
 
1467 次点击  
文章 [ 1 ]  |  最新文章 4 年前
Thiago Barros
Reply   •   1 楼
Thiago Barros    5 年前

通常,我用@gen.coroutine decorator将sqlalchemy函数包装在其他方法中,因此它可以是异步方法。

例如。:

@gen.coroutine
def fetchmany():
   return val.cursor.fetchmany(100)

@gen.coroutine
def loop(self):
   I = yield fetchmany()

我希望能帮助你