大多数 NodeJS 程序员都知道为什么阻塞 NodeJS 的单线程事件循环是不好的。例如,当读取文件时,我们知道最好使用 fs.readFile 而不是 fs.readFileSync。我的问题是:如果 API 要执行的底层任务本质上是同步的,那么首先如何创建异步 API?换句话说,我该如何创建一个 API(例如 fs.readFileSync),而不使用事件循环线程来执行底层任务?我必须在 NodeJS 和 Javascript 之外才能做到这一点吗?
最佳答案
how does one go about creating an asyn API in the first place if the underlying task to be performed by the API is inherently synchronous?
在node.js中,有以下选择用于创建您自己的异步操作:
- 它基于现有的异步操作(例如
fs.readFile()
)。如果你的主操作本身是同步的,并且只能在node.js中同步完成,那么这个选项显然不能解决你的问题。 - 使用
setTimeout()
、setImmediate()
或nextTick()
将代码分成小块,以便其他内容可以与您的代码交错操作并且你不会阻止其他东西共享CPU。这不会阻止 CPU 使用,但它确实允许与其他操作共享 CPU。以下是分块迭代数组的示例,该示例不会阻止其他操作共享 CPU: Best way to iterate over an array without blocking the UI 。 - 将同步操作移至另一个可以执行其任务的进程(另一个 Node.js 进程或任何其他进程)中,然后在完成后使用任何适当的进程间通信机制(TCP、stdio 等)进行异步通信。 .).
- 编写一个 Node.js 插件,您可以在其中使用 native 操作系统线程或 native IO 事件,然后可以在具有异步接口(interface)的 Node.js 中创建新操作。
Do I have to go outside of NodeJS & Javascript to do this?
上面的#1、#2、#3 都可以通过 Javascript 完成。项目 #4 涉及创建一个 native 代码插件(您可以在其中访问 native 线程)。
Another words, how do I go about creating an API such as fs.readFileSync
要真正从头开始创建像 fs.readFileSync()
这样的 API,您必须使用选项#3(同步执行,但在另一个进程中,然后异步传回结果)或选项#4(通过 native 代码插件访问比 Node.js 内置的更低级别的操作系统服务)。
关于javascript - 为 Node JS(或浏览器)创建异步 api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36118346/