从客户的角度来看,非阻塞IO实际如何工作?

时间:2018-10-12 10:38:05

标签: http nonblocking

因此,我遇到了阻塞和非阻塞I / O的想法。但是我从这个概念和一些示例实现中了解到的是,我们在服务器端实现代码以实现代码的这种本质。

但是现在我的问题是,如果(例如邮递员向服务器发送HTTP请求)请求必须等待服务器响应,那么非阻塞I / O的意义何在? (如果我错了,请纠正我)或者整个概念只是为了增加服务器的吞吐量,而不是实际的异步特性。给客户。

例如,在我的一个项目中,我所做的是创建一个发布请求,以在系统中创建一个处理请求,该请求将返回交易ID,现在使用此交易ID,我可以查询服务器以了解结果。

我听起来太天真了,但是这个概念使我很困惑。我不清楚这个概念。请帮忙。

谢谢

2 个答案:

答案 0 :(得分:2)

  

请求必须等待服务器响应,那么非阻塞I / O的意义何在?

有一个混乱。等待响应和(非)阻止I / O的关系非常松散。您总是必须等待响应。这就是为什么您要求开始的原因。但是问题是:如何?

无阻塞HTTP:“尊敬的服务器,这是我的请求,请对其进行处理并向我发送回复,与此同时,我还要执行其他操作,例如计算Pi的第n位(我是怪异)”。

阻止HTTP:“尊敬的服务器,这是我的请求,请对其进行处理并向我发送回复,我将耐心等待它什么也不做”。

  

或者整个概念只是为了增加服务器的吞吐量,而不是实际的异步特性。给客户。

整个概念是能够同时等待I / O的同时做其他事情。并在做到这一点的同时,尽量减少扩展不好的线程的使用。

异步系统,即没有“我要空闲地等待”部分的系统往往会以复杂性为代价来表现更好。

旁注:无阻塞I / o可以在服务器端和客户端使用。例如,浏览器中几乎所有的JS引擎都是基于某种异步引擎构建的。 JS通常是单线程的,这意味着非阻塞I / O是实现任何并发所必需的。

答案 1 :(得分:-1)

  

但是我从概念和一些示例实现中了解的是,我们在服务器端实现代码以实现代码的这种性质。

您在执行非阻塞UI的任何地方都可以实现代码。服务器的操作与客户端使用阻塞或非阻塞UI无关,客户端的操作与服务器使用阻塞或非阻塞UI无关。

  

如果(例如邮递员向服务器发送HTTP请求)请求必须等待服务器响应,那么非阻塞I / O的意义何在?

这样您就不会浪费资源。

让我们首先考虑一个简单的控制台应用程序,该应用程序可以访问Web,然后对结果进行一些处理。在这种情况下,使用非阻塞I / O几乎无济于事,因为应用程序将无所事事地等待着做某事。

现在让我们考虑一个简单的控制台应用程序,该应用程序可以访问50种不同的Web资源并整理响应。现在,非阻塞I / O更加有用,因为使用阻塞I / O,它必须要么获得一个资源,然后获得另一个资源,要么增加50个线程。使用非阻塞I / O,只需少量线程即可使用50个资源,并对每个返回的响应迅速做出响应。

现在,让我们考虑该应用程序的GUI版本,该版本希望保持对用户输入的响应,同时还可以在低功耗,低内存的设备上运行,在这些设备中阻塞线程更加昂贵。以上优点增加了。

最后,考虑一个既与客户端进行I / O的Web应用程序,又与数据库,文件系统以及其他Web应用程序作为客户端的I / O。它可能同时有多个请求,并且阻塞它在客户端执行的I / O或在db,文件或其他应用程序执行的任何I / O都会花费一个线程,这将限制可伸缩性它可以同时处理多少个请求。在I / O处于等待状态时,不阻塞I / O即可将线程用于其他请求。