社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  tornado

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

Adam • 4 年前 • 1507 次点击  

我目前正在使用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
 
1507 次点击  
文章 [ 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()

我希望能帮助你