为nodeJS(或浏览器)

时间:2016-03-20 19:19:55

标签: javascript node.js google-chrome v8

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

1 个答案:

答案 0 :(得分:1)

  如果是的话,如何首先创建一个asyn API   API要执行的基础任务本质上是同步的吗?

在node.js中,有以下选项可用于创建自己的异步操作:

  1. 基于现有的异步操作(例如fs.readFile())。如果你的主要操作本身是同步的,并且只能在node.js中同步完成,那么这个选项显然无法解决你的问题。
  2. 使用setTimeout()setImmediate()nextTick()将代码分成小块,以便其他内容可以与您的操作交错,并且您不会阻止其他内容共享CPU。这不会阻止CPU使用,但它确实允许与其他操作共享CPU。下面是一个以块的形式迭代数组的示例,它不会阻止其他操作共享CPU:Best way to iterate over an array without blocking the UI
  3. 将同步操作移动到另一个可以执行其操作的进程(另一个node.js进程或任何其他进程),然后在使用任何适当的进程间通信机制(TCP,stdio等)完成时异步通信。 )。
  4. 编写一个node.js插件,您可以在其中使用本机操作系统线程或本机IO事件,然后可以在具有异步接口的node.js中创建新操作。
  5.   

    我是否必须走出NodeJS& Javascript要做到这一点吗?

    上面的项目#1,#2,#3都可以通过Javascript完成。第4项涉及创建本机代码插件(您可以在其中访问本机线程)。

      

    换句话说,我该如何创建API等   fs.readFileSync

    要从头开始真正创建fs.readFileSync()之类的API,您必须使用选项#3(同步执行,但在另一个进程中,然后异步通信结果)或选项#4(访问操作系统)服务的级别低于通过本机代码插件内置到node.js中的服务。