译·异步JavaScript的语义

2018-09-07 02:48

Node.js是构建服务器、云服务、移动设备和物联网的JavaScript应用程序的主要平台。由于JavaScript语言是单线程的,所以Node.js程序必须使用运行时管理的异步回调和事件循环来确保应用程序保持响应。虽然这个编程模型在概念上很简单,但是它包含许多由当前Node.js实现隐式定义的细节和行为。本文提出了Node.js异步执行模型的第一个综合形式化,并定义了异步上下文的高级概念,以形式化应用程序中异步事件之间的基本关系。这些形式化为构建静态或动态程序分析工具提供了基础,支持对备选的Node.js事件循环实现的探索,并为推理异步执行的关系提供了高层次的概念框架。在一个Node.js应用程序中的回调。

关键词

JavaScript Asynchrony

1 介绍

JavaScript是当今最流行的编程语言之一,并且正在迅速扩展到超越其传统客户端脚本的地位。Node.js是构建服务器、云服务、移动设备和物联网的JavaScript应用程序的主要平台。这种流行和使用的快速增长导致开发人员越来越需要关于如何最好地使用Node.js公开的许多异步API的信息以及帮助开发、调试或监视应用程序的异步行为的工具。

1.1 事件节点队列

对于Node.js的研究和工具开发来说,一个主要的挑战是缺乏Node.js异步执行模型的正式规范。这个执行模型涉及多个事件队列,一些在本地C++运行时中实现,另一些在Node.js标准库API绑定中执行,还有一些由JavaScript ES6定义。

示例1 . 饿死锁,使用 nextTick 导致 fs.write 的回调’饥饿(starvation)’致死无法执行

1
2
3
4
5
6
var cb = function() { process.nextTick(cb); }
fs.write(process.stdout.fd, 'hi', function() {
/*永远不会打印出来*/
fs.writeSync(process.stdout.fd, 'done');
});
cb();

示例2 . 公平锁,公平合理的进行调度

1
2
3
4
5
6
var cb = function() { setImmediate(cb); };
fs.write(process.stdout.fd, 'hi', function() {
/*一段时间后打印出来*/
fs.writeSync(process.stdout.fd, 'done');
});
cb();

语言特性promise,这些队列在何时处理、如何交织处理以及如何向每个队列怎样添加/在何处添加新事件方面具有不同的规则。这些细微之处往往是响应性和可扩展性应用程序之间的差异,以及表现出关键性故障的差异。

观察上面两个示例代码,它们只在单个节点的使用上有何不同,(示例1) Node API - process.nextTick(cb) 与 (示例2)setImmediate(cb)

示例1的第一行定义了一个函数,当调用该函数时,它将注册自身以再次执行 “once the current turn of the event loop turn runs to completion”。第二行会对stdout进行异步写入,完成时,将调用参数回调方法,该回调将同步打印”done”到stdout。最后调用函数cb。在这个代码块得最后将返回到事件循环并开始从各个队列中调度。

基于Node.js事件循环实现,第一个回调将会是nextTick中注册的cb,尽管它是在fs.write之后才被加入到事件循环中的,并且导致”done”永远不会被打印出来。对nextTick的每次调用都将cb回调插入到一个特殊的nextTick队列中,该队列将在任何其他I/O事件之前被调用排空。这导致任何I/O任务都无法执行,包括fs.writeSync方法。

如果我们使用setImmediate而不是使用nextTick,如示例2中代码,那么我们应该在事件循环的第一次迭代中看到”done”的打印。

这种不同的行为是因为setImmediate会将回调放置在另一个特殊的队列中,在执行了一些基于I/O的回调(但不是全部)后会被耗尽排空。这种交叉使用确保了基于I/O和计时器的回调计算都将取得进展,从而避免了饥饿。

从这个例子中可以看出,在应用程序中使用单个节点队列是不现实的。因此,我们在这项工作中的第一个目标是在Node应用程序中构建异步执行的现实形式化。

翻译自
https://www.microsoft.com/en-us/research/wp-content/uploads/2017/08/asyncNodeSemantics.pdf


标签: javascript,

Creative Commons ©fox 2017 - 2018 | Theme based on fzheng.me &