从客户的角度来看,非阻塞 IO 实际上是如何工作的?
How is non-blocking IO actually works from client's perspective?
所以我想到了阻塞和非阻塞的想法I/O。但是我从概念和一些示例实现中理解的是,我们在服务器端实现代码来实现代码的这种性质。
但现在我的问题是,如果(例如post人向服务器发送HTTP请求)请求必须等待服务器响应,那么非阻塞有什么意义I/O? (如果我错了请纠正我)或者整个概念只是为了增加服务器的吞吐量而不是实际的异步性质w.r.t。给客户。
例如,在我的一个项目中,我所做的是创建一个 post 请求以在系统中创建一个请求以进行处理,该请求将 return 交易 ID,现在使用此交易 ID ,我可以查询服务器以了解结果。
我可能听起来太天真了,但这个概念让我很困惑。我不清楚这个概念。请帮忙。
谢谢
But what I understood from the concept and some of the sample implementations is that we implement code on the server side to achieve this nature of the code.
无论在何处进行非阻塞,都可以实现代码 UI。服务器做什么与客户端使用阻塞还是非阻塞无关UI,客户端做什么与服务器使用阻塞还是非阻塞无关UI.
if (for example postman sending HTTP request to the server) the request has to wait for the server to respond, then what's the point of non-blocking I/O?
这样您就不会浪费资源。
让我们首先考虑一个简单的控制台应用程序,该应用程序访问网络,然后对结果进行处理。在这种情况下,非阻塞 I/O 几乎没有什么好处,因为应用程序无论如何都会坐在那里等待做某事。
现在让我们考虑一个简单的控制台应用程序,它访问 50 个不同的 Web 资源并整理响应。现在非阻塞 I/O 更有用,因为阻塞 I/O 它必须要么一个接一个地获取资源,要么启动 50 个线程。使用非阻塞 I/O 一个,只需少量线程即可访问 50 个资源并迅速响应每个返回的响应。
现在让我们考虑这个应用程序的 GUI 版本,它希望保持对用户输入的响应,同时 运行 在低功耗低内存设备上,阻塞的线程都是更贵。以上优点增加
最后,考虑一个 Web 应用程序 I/O 与客户端同时作为数据库、文件系统和其他 Web 应用程序的客户端。它可能同时有多个请求,并且阻塞它对客户端所做的 I/O 或它对数据库、文件或其他应用程序所做的任何 I/O 都会花费一个线程,这将对它可以同时处理的请求数量设置可伸缩性限制。在 I/O 上不阻塞允许在 I/O 挂起时将线程用于其他请求。
the request has to wait for the server to respond, then what's the point of non-blocking I/O?
有点混乱。等待响应和(非)阻塞 i/o 的关系非常松散。你总是要等待回应。这就是您提出请求的原因。但问题是:如何?
非阻塞 HTTP:"Dear server, here's my request, please process it and send me a response, I'm going to do something else in the meantime, like calculating n-th digit of Pi (I'm a weirdo)"。
阻止 HTTP:"Dear server, here's my request, please process it and send me a response, I'm going to patiently wait for it doing nothing"。
Or the whole concept is just for the increase of throughput of the server instead of actual async nature w.r.t. to client.
整个概念是能够在等待 i/o 的同时做其他事情。并在做到这一点的同时尽量减少不能很好扩展的线程的使用。
异步系统,即没有 "I'm going to wait idly" 部分的系统往往以复杂性为代价表现得更好。
旁注: 非阻塞 i/o 可以在服务器端和客户端使用。例如,浏览器中几乎所有的 JS 引擎都构建在一些异步引擎之上。 JS 通常是单线程的,这意味着非阻塞 i/o 是实现任何并发的必要条件。
所以我想到了阻塞和非阻塞的想法I/O。但是我从概念和一些示例实现中理解的是,我们在服务器端实现代码来实现代码的这种性质。
但现在我的问题是,如果(例如post人向服务器发送HTTP请求)请求必须等待服务器响应,那么非阻塞有什么意义I/O? (如果我错了请纠正我)或者整个概念只是为了增加服务器的吞吐量而不是实际的异步性质w.r.t。给客户。
例如,在我的一个项目中,我所做的是创建一个 post 请求以在系统中创建一个请求以进行处理,该请求将 return 交易 ID,现在使用此交易 ID ,我可以查询服务器以了解结果。
我可能听起来太天真了,但这个概念让我很困惑。我不清楚这个概念。请帮忙。
谢谢
But what I understood from the concept and some of the sample implementations is that we implement code on the server side to achieve this nature of the code.
无论在何处进行非阻塞,都可以实现代码 UI。服务器做什么与客户端使用阻塞还是非阻塞无关UI,客户端做什么与服务器使用阻塞还是非阻塞无关UI.
if (for example postman sending HTTP request to the server) the request has to wait for the server to respond, then what's the point of non-blocking I/O?
这样您就不会浪费资源。
让我们首先考虑一个简单的控制台应用程序,该应用程序访问网络,然后对结果进行处理。在这种情况下,非阻塞 I/O 几乎没有什么好处,因为应用程序无论如何都会坐在那里等待做某事。
现在让我们考虑一个简单的控制台应用程序,它访问 50 个不同的 Web 资源并整理响应。现在非阻塞 I/O 更有用,因为阻塞 I/O 它必须要么一个接一个地获取资源,要么启动 50 个线程。使用非阻塞 I/O 一个,只需少量线程即可访问 50 个资源并迅速响应每个返回的响应。
现在让我们考虑这个应用程序的 GUI 版本,它希望保持对用户输入的响应,同时 运行 在低功耗低内存设备上,阻塞的线程都是更贵。以上优点增加
最后,考虑一个 Web 应用程序 I/O 与客户端同时作为数据库、文件系统和其他 Web 应用程序的客户端。它可能同时有多个请求,并且阻塞它对客户端所做的 I/O 或它对数据库、文件或其他应用程序所做的任何 I/O 都会花费一个线程,这将对它可以同时处理的请求数量设置可伸缩性限制。在 I/O 上不阻塞允许在 I/O 挂起时将线程用于其他请求。
the request has to wait for the server to respond, then what's the point of non-blocking I/O?
有点混乱。等待响应和(非)阻塞 i/o 的关系非常松散。你总是要等待回应。这就是您提出请求的原因。但问题是:如何?
非阻塞 HTTP:"Dear server, here's my request, please process it and send me a response, I'm going to do something else in the meantime, like calculating n-th digit of Pi (I'm a weirdo)"。
阻止 HTTP:"Dear server, here's my request, please process it and send me a response, I'm going to patiently wait for it doing nothing"。
Or the whole concept is just for the increase of throughput of the server instead of actual async nature w.r.t. to client.
整个概念是能够在等待 i/o 的同时做其他事情。并在做到这一点的同时尽量减少不能很好扩展的线程的使用。
异步系统,即没有 "I'm going to wait idly" 部分的系统往往以复杂性为代价表现得更好。
旁注: 非阻塞 i/o 可以在服务器端和客户端使用。例如,浏览器中几乎所有的 JS 引擎都构建在一些异步引擎之上。 JS 通常是单线程的,这意味着非阻塞 i/o 是实现任何并发的必要条件。