为nodeJS(或浏览器)创build一个asychroneous api

大多数NodeJS程序员知道为什么阻塞NodeJS的单线程事件循环是不好的。 例如,在读取文件时,我们知道最好使用fs.readFile而不是fs.readFileSync。 我的问题是:如果由API执行的基本任务本质上是同步的,那么如何创build一个asyn API呢? 换句话说,我该如何去创build一个像fs.readFileSync这样的API,而不是使用事件循环线程来执行底层任务呢? 我必须走出NodeJS和Javascript来做到这一点吗?

如果API所执行的基本任务本质上是同步的,那么如何创build一个asyn API呢?

在node.js中,创build自己的asynchronous操作有以下select:

  1. 将其基于现有的asynchronous操作(如fs.readFile() )。 如果你的主操作本身是同步的,只能在node.js中同步完成,那么这个选项显然不能解决你的问题。
  2. 使用setTimeout()setImmediate()nextTick()将代码分解成小块,以便其他事情可以与您的操作交错,并且不会阻止共享CPU的其他内容。 这不会阻止CPU使用率,但它确实允许与其他操作共享CPU。 下面是一个以块为单位迭代数组的示例,它不会阻止共享CPU的其他操作: 在不阻塞UI的情况下迭代数组的最佳方法 。
  3. 将同步操作移动到另一个进程(另一个node.js进程或任何其他进程),可以完成它的事情,然后在使用任何适当的进程间通信机制(TCP,stdio等)进行asynchronous通信时进行通信。
  4. 编写一个node.js插件,您可以使用native OS线程或本地IO事件,然后可以在具有asynchronous接口的node.js中创build一个新的操作。

我必须走出NodeJS和Javascript来做到这一点吗?

以上项目#1,#2,#3都可以使用Javascript完成。 项目#4涉及创build一个本地代码插件(在那里你可以访问本地线程)。

换句话说,我如何去创build一个API,比如fs.readFileSync

要从头开始真正创build一个像fs.readFileSync()这样的API,您必须使用选项#3(同步执行,然后在另一个进程中asynchronous传回结果)或选项#4(访问OS服务低于通过本地代码插件构build到node.js中的级别)。