【问题标题】:Using tornado, creating an asynchronous function for a blocker function which uses sqlalchemy fetchmany()使用龙卷风,为使用 sqlalchemy fetchmany() 的阻塞函数创建异步函数
【发布时间】:2018-10-09 22:39:00
【问题描述】:

我目前正在使用 tornado 开发一个拥有多个用户的 API。出于性能原因,整个 API 都是异步的将是有益的。在当前代码中,我利用 cursor.fetchmany(# of rows) 从数据库中获取许多行并写入指定文件(csv、json)。我正在尝试使此过程异步,但在这样做时遇到了麻烦。提取处理大量数据,因此如果多人使用 API,它将显着减慢速度,因为人们正在“等待”其他用户的提取完成。

我曾尝试使用IOLoop,但收效甚微

我也试过这样的事情

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

但是这样做存在错误,因为函数 fetchmany 不是原生的 tornado 函数,并且其结构不支持这一点。 我的一些问题是......

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

2)这是否可能或数据库是否限制了龙卷风异步编码的功能

3) 如果这是不可能的,我可以实现类似“ThreadPoolExecutor”的东西来通过多线程加速进程,或者使用 fetchmany 的替代品吗? (我认为这是不可能的,只是想概述一下我的一些思考过程)

任何帮助将不胜感激。

【问题讨论】:

标签: python asynchronous sqlalchemy tornado


【解决方案1】:

一般我用@gen.coroutine装饰器将SQLAlchemy函数包装在其他方法中,所以它可以是一个异步方法。

例如:

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

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

希望能帮到你

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-24
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多