ipa*_*ola 19 python mysql tornado nonblocking
Tornado宣称自己是"一个相对简单,无阻塞的 Web服务器框架",旨在解决C10k问题.但是,看看包装MySQLdb的数据库包装器,我遇到了以下代码:
def _execute(self, cursor, query, parameters):
try:
return cursor.execute(query, parameters)
except OperationalError:
logging.error("Error connecting to MySQL on %s", self.host)
self.close()
raise
Run Code Online (Sandbox Code Playgroud)
据我知道的MySQLdb的,它是建立在顶部的呼叫libmysqlclient
,被拦截.
我是否正确地认为长时间运行的查询会导致整个Tornado服务器无响应直到它完成或代码上有魔力?
jho*_*ter 33
如果你在顶部编写非阻塞代码,龙卷风是非阻塞的,例如.使用asyncmongo和@ tornado.web.asynchronous装饰器.作为框架的龙卷风为此提供了工具.
原作者之一布雷特泰勒写道:
我们尝试了不同的异步数据库方法,但在FriendFeed上确定了同步,因为通常如果我们的数据库查询正在对请求进行积压,那么我们的后端无论如何都无法扩展到负载.那些足够慢的东西被抽象为分离后端服务,后端服务是我们通过异步HTTP模块异步获取的.
确实,Tornado不包含非阻塞数据库层; 事实上,数据库层根本不是Tornado框架的组成部分,而不是像Django的ORM.是的,Tornado附带了阻止MySQL包装器,因为这就是FriendFeed碰巧使用的东西,但它更像是一个外部库而不是核心功能.我很确定大多数人都在使用其他东西进行数据库访问.
Nic*_*ght 15
是的,如果没有其他措施,服务器将等待查询完成执行.这并不意味着Tornado不是一个非阻塞的Web服务器.
"非阻塞Web服务器"不会阻塞网络I/O(如果它执行静态文件服务,则可能有一些磁盘I/O设置).这并不意味着您在应用程序中会立即执行违反因果关系的指令.
执行数据库调用需要时间,就像读取文件,格式化字符串,处理模板等需要时间.在与服务器的主事件循环相同的线程中执行任何这些操作将阻止循环继续前进,直到完成为止.
归档时间: |
|
查看次数: |
9884 次 |
最近记录: |