2016-08-16 61 views
0

使用异步函数的幕后实际发生了什么?关于异步方法和线程

它是否打开一个新线程并让操作系统启动并运行它?

如果是这样,是否会导致死锁或其他线程问题?

这里的一个异步方法的一个示例:

var fs = require('fs') 
var file = process.argv[2] 

fs.readFile(file, function (err, contents) { 
    var lines = contents.toString().split('\n').length - 1 
    console.log(lines) 
}) 

回答

1

fs.readFile(file,callback)。这是一个非阻塞调用,这意味着。

  1. 节点的主线程专卖店在事件表中的callback和 它只要文件 阅读过程完成后,这将发出一个事件相关联。
  2. 同时节点有几个内部线程(线程池) 哪个节点的主线程将文件读取任务分配给 线程中的一个。
  3. 在这个赋值之后,该命令返回到主线程并且 主线程继续执行其他任务并且文件读取进程 由其他线程(不是主线程)在后台完成。
  4. 每当文件读出处理完成后用 的callback相关联的事件与从文件中的数据发射的沿,并且其中事件循环尝试将每个任务推 到主线程(堆),该 回调被推入task-queue
  5. 并且当主线程(堆栈)变为可用并且没有 任务存在于callback的任务之前时,此回调将通过事件循环推送到 主线程的堆栈。

有关更多信息,请参阅event-loop

所以负责文件读取的线程不会导致死锁到其他线程。 它只是发出异常或成功,这是后来由callback

+0

处理所以我们不必担心使用节点的异步功能时的线程问题? – shinzou

+0

是的。 您不必这样做。因为发生的任何异常都将由回调处理。 – vkstack