【问题标题】:blocking code in non-blocking http server非阻塞http服务器中的阻塞代码
【发布时间】:2015-11-25 02:02:25
【问题描述】:

比如我有一个http服务器,就是node.js,所以是非阻塞的。

对于每个请求都会做一次数据库操作。

我无法理解的是阻塞数据库操作和非阻塞数据库操作有什么区别?

由于web服务器是非阻塞的,所以请求中的阻塞DB操作没有区别?

【问题讨论】:

标签: node.js blocking nonblocking


【解决方案1】:

我猜你在非阻塞和线程之间混淆了。当你的nodejs在一个线程上运行时,如果你收到多个请求,每个请求都需要访问数据库,在非阻塞的情况下,nodejs只会请求数据库的数据,不会等待数据库的响应并继续处理下一个请求,以阻塞方式,只有线程,当它一次响应一个http请求时,会导致请求超时。

编辑:你可以查看this question的答案,我想他的解释更好。

【讨论】:

    【解决方案2】:

    这是一个可以帮助您理解的类比。假设您在做销售,今天要打 50 个电话。

    在阻塞模型中,您拨打电话,如果对方没有准备好与您交谈,您必须坐在线路上等待,然后等到他们准备好与您交谈。当他们终于准备好与您交谈时,您可以进行交谈,挂断电话,然后才能拨打下一个电话并重复该过程。因此,您的手机忙而您无法拨打电话的时间是您等待客户准备好与您通话的所有时间加上您通话的所有时间的总和。

    在非阻塞模式中,您拨打电话,如果此人无法立即联系,您可以快速留言,他们会在准备好通话时给您回电。您在留言后挂断,并立即致电您的下一位客户。您的电话占线的总时间只是留下快速消息的时间,然后是您在他们回电时通话的时间。他们是否在一分钟或三个小时内给您回电话实际上对您来说并不重要 - 这不会影响您拨打电话的整体效率。显然,您可以使用非阻塞模型发起和完成更多呼叫,因为您不会浪费很多时间,因为您可以通过等待客户端准备好通话来做其他事情。

    node.js 通过使用非阻塞 I/O 模型而不使用线程来提高效率。如果实施得当,这种非阻塞模型比让大量单独线程都在等待其阻塞请求更有效。

    因此,在 node.js 中,如果您有一个阻塞的数据库请求,那么在该数据库请求被阻塞的整个过程中,node.js Web 服务器无法执行任何其他操作。它只有一个线程,因此如果该线程忙于处理需要一段时间才能完成的阻塞请求,则服务器基本上会在很长一段时间内变得无用。这将是 node.js 服务器进程的错误实现,并且以这种方式使用 node.js 没有什么意义。

    使用非阻塞数据库请求,node.js 服务器开始处理 http 请求。它运行一些代码,然后到达非阻塞数据库请求。该请求已启动并注册回调以完成,但由于它是非阻塞的,因此数据库调用立即返回。 node.js 服务器返回到它的事件循环,并可以立即开始处理其他 http 请求或其他事件以供服务器处理(例如,其他 http 请求的完成)。然后,一段时间后,数据库调用完成并将一个条目放入事件队列以触发其回调。当 nodejs 服务器到达事件队列中的该事件时,将调用回调,并且该原始请求现在具有来自数据库服务器的答案并且可以完成该原始请求。同时,它一直在等待该数据库请求完成,并忙于处理其他事情——所有这些都在一个线程中完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-18
      相关资源
      最近更新 更多