为什么 MySQL drivers/clients 像 MySQLdb 或 mysqlclient 或 PyMySQL 即使在像 Tornado 这样的异步 Web 框架中使用时也被认为是阻塞的?

Why MySQL drivers/clients like MySQLdb or mysqlclient or PyMySQL considered Blocking even when used in Async Web Frameworks like Tornado?

在像 Tornado 这样的异步 Web 框架中,我们可以使用它的 @gen.coroutine 或 @tornado.web.asynchronous 装饰器进行非阻塞调用。例如,我们可以使用 AsyncHTTPClient 模块进行非阻塞或异步调用。

所以我们可以通过使用@gen.coroutine装饰器和"yield"关键字来使用它,比如"yield tornado.httpclient.AsyncHTTPClient().fetch(url)",或者通过@tornado.web.asynchronous使用回调函数。对于这两种方法,它都是非阻塞的。

同样,那为什么不能像MySQLdb, PyMySQL那样对Python的MySQL drivers/clients做同样的事情,mysqlclient 等。我的意思是为什么这些驱动程序不能像 AsyncHTTPClient 与 gen.coroutine 或通过 web.asynchronous 装饰器的回调一起使用一样使用。为什么驱动程序不能与 gen.coroutine 或 web.asynchronous 一起使用以使调用成为非阻塞的?

阻止它们异步的原因是什么,我的意思是 AsyncHTTPClient 是非阻塞的,但 MySQLdb.connect、MySQLdb.connect().cursor.query() 等不是?

我也知道很少有异步 Tornado 特定的 MySQL drivers/clients 像 TorMySQL, Tornado-MySQL (by PyMySQL), asynctorndb等等。但是为什么像mysqlclient或者MySQLdb这样的普通drivers/clients不能直接作为非阻塞使用呢,或者TorMySQL有什么变化, Tornado-MySQL (by PyMySQL) 它们被定义为 async mysql drivers/clients for Tornado?

当我们说 Tornado 是一个异步框架时,这是一个要求,而不是效果。为了有效地使用 Tornado,你所做的任何昂贵的事情都需要是异步的; Tornado 不能神奇地使同步代码异步。这意味着您需要选择与 Tornado 兼容的异步库,或者 运行 在另一个线程中进行昂贵的阻塞操作。

有关详细信息,请参阅 introduction to asynchronous I/O in the Tornado User's guide