为什么像MySQLdb或mysqlclient或PyMySQL这样的MySQL驱动程序/客户端即使在像Tornado这样的异步Web框架中使用时也会被视为阻塞?

时间:2016-01-14 00:31:23

标签: python mysql asynchronous tornado mysql-python

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

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

同样,那么为什么不能以相同的方式为Python的MySQL驱动程序/客户端(如MySQLdb,PyMySQL,mysqlclient等)做同样的事情。我的意思是为什么这些驱动程序不能像AsyncHTTPClient和gen一样使用.coroutine或通过web.asynchronous装饰器回调。为什么驱动程序不能与gen.coroutine或web.asynchronous一起使用以使调用无阻塞?

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

另外我知道很少有异步的Tornado特定的MySQL驱动程序/客户端,如TorMySQL,Tornado-MySQL(由PyMySQL),asynctorndb等。但为什么不能将像mysqlclient或MySQLdb这样的普通驱动程序/客户端直接用作非-blocking,或者TorMySQL,Tornado-MySQL(由PyMySQL)做出的改变是什么,它们被定义为Tornado的异步mysql驱动程序/客户端?

1 个答案:

答案 0 :(得分:2)

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

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