Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 龙卷风真的不阻塞吗?_Python_Mysql_Tornado_Nonblocking - Fatal编程技术网

Python 龙卷风真的不阻塞吗?

Python 龙卷风真的不阻塞吗?,python,mysql,tornado,nonblocking,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 con

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
据我所知,对MySQLdb的调用是阻塞的,MySQLdb构建在
libmysqlclient
之上。


我认为一个长时间运行的查询会使整个Tornado服务器在完成之前没有响应,或者代码中有魔力吗?

是的,如果没有其他措施,服务器将等待查询完成执行。这并不意味着Tornado不是一个无阻塞的web服务器

“非阻塞web服务器”不会阻塞网络I/O(如果它提供静态文件服务,则可能会有一些磁盘I/O的规定)。这并不意味着您可以在应用程序中立即执行违反因果关系的指令


执行数据库调用需要时间,就像读取文件、格式化字符串、处理模板等需要时间一样。在与服务器的主事件循环相同的线程中执行这些操作都会阻止循环继续运行,直到完成为止。

是;这根本不是一个完全无阻塞的web服务器

非阻塞Web服务器不会阻塞,它使用用于文件I/O、数据库访问等的非阻塞API,以确保一个必须等待某些内容完成的请求不会阻止其他请求的处理。这适用于可能阻塞服务器的所有内容,包括数据库访问

在非阻塞数据库访问中,没有什么比“因果冲突”更愚蠢的了;运行与一个请求相关的非阻塞查询,并在该请求仍在运行时处理其他请求,这是非常有意义的。实际上,这通常意味着与数据库后端建立多个连接


请注意,如果您试图运行一万个并发请求,请小心:大多数数据库后端无法处理此问题。如果您有几十个以上的数据库请求要并行运行,那么您可能需要连接池之类的东西,以允许web服务器进行大量数据库连接,而不会淹没后端。这将导致请求阻塞,在队列中等待数据库访问,但这样做意味着它不会阻塞整个服务器——只会阻塞需要数据库的请求。

如果您在顶部编写非阻塞代码,则Tornado是非阻塞的,例如,使用和装饰器。Tornado作为一个框架提供了这方面的工具

布雷特·泰勒,原作者之一:

我们尝试了不同的异步DB方法,但最终还是解决了这个问题 FriendFeed上的同步,因为通常如果我们的DB查询 备份我们的请求,我们的后端无法扩展到负载 无论如何那些足够慢的东西被抽象成了可以分开的东西 我们通过异步HTTP异步获取的后端服务 模块


Tornado确实不包括非阻塞数据库层;事实上,与Django的ORM相反,数据库层根本不是Tornado框架的组成部分。是的,Tornado附带了阻塞MySQL包装器,因为FriendFeed恰好使用了它,但它更多的是一个外部库,而不是核心功能。我敢肯定大多数人都在使用其他工具访问数据库。

Tornado是非阻塞的,但仅限于某些IO操作,如读取或写入套接字文件

如果您希望代码中的所有内容都是非阻塞的,那么您必须自己设计。但是如果您的代码是计算密集型的,那么非阻塞对您来说毫无意义。在这种情况下,您可以使用多进程


记住,非阻塞只是意味着服务器发送/接收日期不会阻塞。如果你不能使你的代码无阻塞,那么你的整个应用程序在某种程度上是阻塞的。

你期望什么?非阻塞并不意味着“所有线路同时运行”。-1表示接受错误答案;非阻塞Web服务器不应该因为其他请求的数据库访问(磁盘访问)而阻塞请求。我很欣赏这一评论,但我相信我接受了解决我问题的答案:使用MySQL包装器会使整个服务器阻塞吗。答案似乎是:会的。Tornado不提供与MySQL对话的进程池,因此它会阻塞。你的回答也有道理,但尼古拉斯先来了。谢谢你的快速回复。我认为非阻塞意味着当一个请求等待处理时,另一个请求正在处理,因为web服务器的操作是异步的。在这种情况下,如果9999个用户请求一个半静态页面,而一个用户请求一个长时间运行的查询页面,9999个用户将不得不等待一个用户。因此,如果我想在我的web应用程序中实现非阻塞数据库访问,我将如何使用Tornado实现这一点?你没有。您可以添加更多Tornado实例,并在它们之间实现负载平衡。您的数据库查询不应该花费那么长的时间;否则,这就掩盖了其他一些设计和/或操作问题。或者,您也可以使用异步接口和更为并发友好的数据库,如asyncmongo或motor与MongoDB。我是否可以以某种方式使用python线程实现多个任务的并行执行?您正在解决一些您不完全理解的问题。Tornado Web服务器是非阻塞的。如果您选择在MySQLdb周围使用Tornado框架的可选瘦包装器,您可能会损害非阻塞web服务器的好处,但这绝对不能说明web服务器本身,数据库模块不是web服务器的一部分。@Nicholas Knight:不,我完全理解什么是“非阻塞web服务器框架”(重读OP)方法显然,你没有。