Python 为什么MySQLdb、mysqlclient或PyMySQL等MySQL驱动程序/客户端即使在Tornado等异步Web框架中使用,也会考虑阻塞?

Python 为什么MySQLdb、mysqlclient或PyMySQL等MySQL驱动程序/客户端即使在Tornado等异步Web框架中使用,也会考虑阻塞?,python,mysql,asynchronous,tornado,mysql-python,Python,Mysql,Asynchronous,Tornado,Mysql Python,在像Tornado这样的异步web框架中,我们可以使用@gen.coroutine或@Tornado.web.asynchronous decorators进行非阻塞调用。例如,我们可以使用AsyncHTTPClient模块进行非阻塞或异步调用 因此,我们可以使用@gen.coroutine decorator和“yield”关键字,比如“yield tornado.httpclient.asynchtpclient().fetch(url)”,或者使用@tornado.web.asynchro

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

因此,我们可以使用@gen.coroutine decorator和“yield”关键字,比如“yield tornado.httpclient.asynchtpclient().fetch(url)”,或者使用@tornado.web.asynchronous的回调函数。对于这两种方法,它都是非阻塞的

类似地,为什么Python的MySQL驱动程序/客户端(如MySQLdb、PyMySQL、mysqlclient等)不能以同样的方式使用呢?我的意思是,为什么这些驱动程序不能像AsyncHTTPClient与gen.coroutine或通过web.asynchronous decorators回调一起使用一样使用呢。为什么驱动程序不能与gen.coroutine或web.asynchronous一起使用以使调用无阻塞

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


我还知道,像TorMySQL、Tornado MySQL(由PyMySQL提供)、asynctorndb等异步Tornado特定的MySQL驱动程序/客户端很少。但为什么像mysqlclient或MySQLdb这样的普通驱动程序/客户端不能直接用作非阻塞,或者TorMySQL、Tornado MySQL(由PyMySQL提供)中有哪些更改它们被定义为Tornado的异步mysql驱动程序/客户端吗?

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


有关更多详细信息,请参阅。

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


有关更多详细信息,请参阅。

欢迎使用SO。请阅读并欢迎访问SO。请阅读并感谢Ben,虽然我知道你已经说过了,但我真正的问题是为什么MySQL驱动程序/客户端会阻塞,而不是AsyncHTTPClient模块,这两个模块有什么区别?我的意思是,到底发生了什么,控制流和一切,这就是我想知道的。一切都是同步的,除非它完全是异步的。通常,异步函数要么接受回调参数,要么返回占位符(类似于未来)来代替其“真实”结果。那我们为什么不能用MySQLdb调用呢。什么样的实现阻止它使用异步回调样式,甚至协同路由样式。我的意思是,为什么我不能使用MySQLdb调用将()连接到数据库,使用gen.coroutine的yield或使用web.asynchronous的回调样式执行()查询。为什么我不能对MySQL调用执行此操作,并使其遵守Tornado的异步规则?到底是什么阻止了它?在所有这一切中,什么是正在成为问题的实现?您需要向所有
MySQLdb
函数及其内部使用的所有网络调用添加回调参数(或
Future
返回值)。一旦你做到了这一点,它就不再与旧的同步接口兼容了。所以这意味着,在MySQLdb模块内部有阻塞调用,异步库基本上侵入了它,并通过使用IOLoop将这些阻塞调用更改为异步,因此异步库可以进行非阻塞调用?这就是原因吗?谢谢Ben,虽然我知道你已经说过了,但我真正的问题是为什么MySQL驱动程序/客户端会阻塞,而不是AsyncHTTPClient模块,这两个模块之间有什么区别?我的意思是,到底发生了什么,控制流和一切,这就是我想知道的。一切都是同步的,除非它完全是异步的。通常,异步函数要么接受回调参数,要么返回占位符(类似于未来)来代替其“真实”结果。那我们为什么不能用MySQLdb调用呢。什么样的实现阻止它使用异步回调样式,甚至协同路由样式。我的意思是,为什么我不能使用MySQLdb调用将()连接到数据库,使用gen.coroutine的yield或使用web.asynchronous的回调样式执行()查询。为什么我不能对MySQL调用执行此操作,并使其遵守Tornado的异步规则?到底是什么阻止了它?在所有这一切中,什么是正在成为问题的实现?您需要向所有
MySQLdb
函数及其内部使用的所有网络调用添加回调参数(或
Future
返回值)。一旦你做到了这一点,它就不再与旧的同步接口兼容了。所以这意味着,在MySQLdb模块内部有阻塞调用,异步库基本上侵入了它,并通过使用IOLoop将这些阻塞调用更改为异步,因此异步库可以进行非阻塞调用?这就是原因吗?