非阻塞 API 是如何工作的?
How non-blocking API works?
我一直在阅读 Play Framework documentation 并发现这句话令人困惑:
Note that you may be tempted to therefore wrap your blocking code in
Futures. This does not make it non-blocking, it just means the
blocking will happen in a different thread. You still need to make
sure that the thread pool that you are using has enough threads to
handle the blocking.
我的印象是所有那些非阻塞库都在它们自己的线程池和 return Future
对象中进行阻塞操作,因此客户端代码不会阻塞。
但是这句话说它并没有使它成为非阻塞的。我错过了什么吗?非阻塞库有一些高级魔法吗?
Blocking(如 Blocking IO)在 IO 的意义上意味着启动 IO 的线程进入休眠状态,直到IO 结果可用。
Non-Blocking IO(或Asynchronous IO)告诉相关驱动程序(内核、数据库驱动程序等)初始化一个 IO 动作,然后线程 继续做其他事情 。根据您使用的技术,您可以在回调(例如 Node.js)、通道(Java)、期货(C++)、承诺(较新版本)中处理异步 IO 结果(甚至可能是异常) Node.js)、任务 (.Net)、协程 (C++17) 等
异步IO不使用线程使IO异步。这是这里的关键点。向线程池抛出阻塞 IO 操作不会使其异步,它只是阻塞在另一个线程上,并且非常不可扩展。它将使线程池中的线程被排空,因为它们只会随着越来越多的阻塞 IO 被提交而阻塞。正如他们在文档中所写:
The most common place where a typical Play application will block is
when it’s talking to a database. Unfortunately, none of the major
databases provide asynchronous database drivers for the JVM
意味着大多数数据库实现不为 Java 提供异步 IO - 向线程池抛出 SQL 查询将使线程池线程阻塞。这就是他们所说的意思:
Note that you may be tempted to therefore wrap your blocking code in
Futures. This does not make it non-blocking, it just means the
blocking will happen in a different thread.
正如我们之前所说,异步 IO 不是另一个线程上的阻塞 IO。
标准包 java.nio
提供了 Java 中 Real 异步 IO 的示例
我一直在阅读 Play Framework documentation 并发现这句话令人困惑:
Note that you may be tempted to therefore wrap your blocking code in Futures. This does not make it non-blocking, it just means the blocking will happen in a different thread. You still need to make sure that the thread pool that you are using has enough threads to handle the blocking.
我的印象是所有那些非阻塞库都在它们自己的线程池和 return Future
对象中进行阻塞操作,因此客户端代码不会阻塞。
但是这句话说它并没有使它成为非阻塞的。我错过了什么吗?非阻塞库有一些高级魔法吗?
Blocking(如 Blocking IO)在 IO 的意义上意味着启动 IO 的线程进入休眠状态,直到IO 结果可用。
Non-Blocking IO(或Asynchronous IO)告诉相关驱动程序(内核、数据库驱动程序等)初始化一个 IO 动作,然后线程 继续做其他事情 。根据您使用的技术,您可以在回调(例如 Node.js)、通道(Java)、期货(C++)、承诺(较新版本)中处理异步 IO 结果(甚至可能是异常) Node.js)、任务 (.Net)、协程 (C++17) 等
异步IO不使用线程使IO异步。这是这里的关键点。向线程池抛出阻塞 IO 操作不会使其异步,它只是阻塞在另一个线程上,并且非常不可扩展。它将使线程池中的线程被排空,因为它们只会随着越来越多的阻塞 IO 被提交而阻塞。正如他们在文档中所写:
The most common place where a typical Play application will block is when it’s talking to a database. Unfortunately, none of the major databases provide asynchronous database drivers for the JVM
意味着大多数数据库实现不为 Java 提供异步 IO - 向线程池抛出 SQL 查询将使线程池线程阻塞。这就是他们所说的意思:
Note that you may be tempted to therefore wrap your blocking code in Futures. This does not make it non-blocking, it just means the blocking will happen in a different thread.
正如我们之前所说,异步 IO 不是另一个线程上的阻塞 IO。
标准包 java.nio