【问题标题】:Is it possible to asynchronously query SQL Server from Python (3.4)?是否可以从 Python (3.4) 异步查询 SQL Server?
【发布时间】:2014-07-18 08:01:49
【问题描述】:

是否可以从 Python (3.4) 对 Microsoft SQL Server 执行异步查询,即在 asyncio 事件循环的上下文中?

以下是一个骨架 asyncio 程序,其中 (async) SQL 查询应该适合 do_it 函数:

import asyncio
import contextlib


@asyncio.coroutine
def do_it():
    # TODO: Make an asynchronous MS SQL query, but how??
    fut = asyncio.Future()
    fut.set_result(None)
    return fut


with contextlib.closing(asyncio.SelectorEventLoop()) as loop:
    asyncio.set_event_loop(loop)
    loop.run_until_complete(do_it())

print('Finished')

【问题讨论】:

    标签: python sql-server asynchronous python-3.4 python-asyncio


    【解决方案1】:

    目前只有通过 aiopg 库的 PostgreSQL 原生 asyncio 支持。

    但您可以通过loop.run_in_executor() 对 MSSQL 运行同步调用。

    【讨论】:

    • 谢谢,我知道线程执行器选项。但是,我看到例如 mxODBC supports async,所以我希望我可以将这样一个支持异步的组件安装到 asyncio 框架中。
    • 我写了 aiopg 作为 psycopg2 的异步包装器。如果您需要 mxODBC 的异步兼容包装器,您可能应该自己创建它(或等待某人实现这项工作)。
    • 不,我的意思是,我不需要 异步包装器。如果可能的话,我真的只需要知道如何异步查询 SQL Server。到目前为止,我在这方面发现的唯一选项是 mxODBC Connect,它充当 SQL Server 的代理服务器。不幸的是,Connect 的成本很高。
    【解决方案2】:

    到目前为止,我发现的一个选择是商业产品mxODBC Connect,不幸的是它要花费数百美元。通过为 SQL Server 提供代理服务器,它能够支持异步调用。据说异步支持是通过gevent 实现的,所以我不知道它是否适合异步。在 Python 的ODBC wiki 中,mxODBC 是列出的唯一支持异步的产品。

    【讨论】:

      【解决方案3】:

      我讨厌“不要那样做”的答案,但the article by Mike Bayer, the creator of SQLAlchemy 让我完全这么想:

      "当涉及到典型的数据库逻辑时,使用它与传统的线程方法相比没有任何优势,您可能会期望性能会有小到中等的下降,而不是增加

      【讨论】:

      • 当代码可以使用 CPython 的 asyncio 以更清晰、更简单的方式编写时,有时对性能的影响是可以接受的。
      • 我同意异步代码是在 Python 中编写清晰的并行代码的唯一方法,因为 GIL。
      • (Mike Bayer 的)文章是基于对并发的真正含义的误解。如果你只触发异步函数一次它会变慢,这是真的。但是它会触发很多异步函数,尤其是。在 IO 上下文中,您会发现您可以同时执行更多操作。这是并发性真正大放异彩的领域。当您有数百个同时请求时,线程不是一个选项。
      • 我怀疑 Mike Bayer 不明白。事实上,他建立的基准就是这样做的。如果我正确获取数据(我承认,我没有深入阅读代码),线程 SQL 客户端在旧笔记本电脑上的 350 个并发线程上击败异步,并且 CPU 越强大,线程性能越好。你有其他数据来支持你相当有力的主张吗?
      • 有一种说法是异步代码对数据库没有帮助,如果您查看 techempower 基准测试,您会发现 rust actix + async postgres 比使用同步 ORM 的完全相同的代码库快 3 倍。这就是每天支持 100 万用户或 300 万用户之间的差异。我讨厌不这样做的答案。 sqlalchemy 的创建者 Mike bayer 在 10 年后一直没有想出一种方法来使他的库异步。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      相关资源
      最近更新 更多