没有合适的资源?快使用搜索试试~ 我知道了~
首页Node.js异步模型深度解析:构建响应应用的基石
Node.js异步模型深度解析:构建响应应用的基石
需积分: 10 3 下载量 43 浏览量
更新于2024-09-09
收藏 571KB PDF 举报
本文档探讨了"异步JavaScript语义"在Node.js运行时环境中的关键作用。Node.js已经成为开发云应用、移动应用或物联网(IoT)应用的主要平台,尤其因为JavaScript是一种单线程语言。为了保持应用程序的响应性,Node.js程序依赖于异步回调和由运行时管理的事件循环。尽管这种编程模型在概念上看似简单,但实际操作中隐藏着许多微妙之处和隐含的行为,这些都源自当前Node.js实现的具体细节。 作者们首先提出了一种全新的、全面的Node.js异步执行模型的正式化阐述,这是对现有技术的一个重大突破。他们引入了"async-contexts"这一高级概念,旨在系统地定义在应用程序中异步事件之间的基本关系。async-contexts为理解异步回调的执行顺序和交互提供了一个清晰的框架,这对于构建静态或动态代码分析工具至关重要。 通过这些形式化的工作,研究者们不仅能够更好地理解和调试现有的Node.js应用程序,还为探索不同的Node.js事件循环实现提供了理论基础。开发者可以借此优化性能,提高代码的可维护性和可靠性。此外,对于那些试图设计新型异步编程模式或者进行更深层次语言设计的人来说,这篇论文为思考和实验提供了强有力的概念工具。 本文为Node.js社区提供了一个强大的理论支撑,促进了对该语言异步特性更深入的理解,推动了相关工具的发展,并为改进Node.js的异步编程模型铺平了道路。这对于所有从事Node.js开发以及研究该领域复杂性的专业人士来说,都是不可多得的宝贵资源。
资源详情
资源推荐
Semantics of Asynchronous JavaScript DLS’17, October 24, 2017, Vancouver, Canada
v ∈ Val ::= . ..
| (n, r, fs) promise tuple
r ::= unres unresolved
| res(v) resolved to v
fs ::= [f
1
, ..., f
m
] callbacks
n priority levels
e ∈ Exp ::= . . .
| Promise() create a promise
| e.resolve(e) resolve a promise
| e.then(e) add a listener
| • the event loop
Fig. 3. Syntax of λ
async
.
Expression e are extended with three operations for work-
ing with promises:
• Promise() creates a new promise (of priority 0).
• e
1
.resolve(e
2
) resolves promise e
1
to the value of e
2
.
• e
1
.then(e
2
)
schedules
e
2
for execution once promise
e
1
is resolved.
This interface deviates from regular promises where the
resolve
method is (usually) hidden and where the construc-
tor function for a promise takes a function as an argument:
A JavaScript
Promise(f )
creates a new promise that executes
f asynchronously and when it returns a value, the promise
resolves to that value. In our model this can be expressed as:
function Promise(f) {
var p = Promise();
process.nextTick( function() {
p.resolve(f());
});
return p;
}
Finally, the special
•
expression is used to allow the execu-
tion of callbacks associated with asynchronous computation.
Javascript has ‘run to completion’ semantics, meaning that
once a Javascript function is called, that function as well as
any other functions invoked synchronously are run without
preemption until they terminate. When the special
•
expres-
sion is reached, control returns to the runtime allowing it to
ush its work queues according to the semantics described
in Section 2.3.
2.2 Priorities
We use priorities to enable the modeling of asynchronous
semantics in Node.js using a single abstraction. We are es-
pecially interested in the behavior of a regular promise,
.then
,
setTimeout
,
setImmediate
, regular asynchronous I/O,
and
process.nextTick
. It turns out we can model all these
concepts using a single priority mechanism. We assign the
following priorities to the various operations:
0.
For
process.nextTick
and regular promises, i.e. the mi-
crotask queue;
1. For setImmediate;
2. For setTimeout;
3. For all other asynchronous I/O, e.g. readFile etc.
To model all operations as priority promises, we assume an
initial heap
H
0
that contains the following global promises
that are always resolved:
H
0
= [nexick 7→ (0, res(undef ), []),
immediate 7→ (1, res(undef ), []),
timeout
0
7→ (2, res(undef ), [])]
With these promises we can dene various primitives simply
as a call to .then on one of these predened promises:
process.nextTick (f ) = nexick. then(f )
setImmediate(f ) = immediate.then(f )
setTimeout(f , 0) = timeout
0
.then(f )
In Section 2.4 we show how general timeouts and I/O is
handled.
2.3 Semantics
Figure 4 denes the asynchronous semantics of
λ
async
using
priority promises. Reduction rules have the form
H ⊢ e →
H
′
⊢ e
′
which denotes an expression e under a heap H evalu-
ating to a new expression
e
′
and heap
H
′
. We write
H[p]
to
get the value that an address p points to in the heap H , and
H[p7→v]
to update the heap H such that p points to value v.
The evaluation context E is dened by
λ
js
[11] and basi-
cally captures the current execution context. The E-Ctx rule
denotes that in any
λ
js
evaluation context E we can evaluate
according to
λ
js
(note: in
λ
js
they use
σ
to denote a heap
H), e.g. the premise
H ⊢ e →
∗
H
′
⊢ e
denotes that if we can
evaluate and expression e under a heap H to
e
′
with a new
heap
H
′
using
λ
js
semantics, we can apply that rule in any
evaluation context in our semantics too. All the other rules
now deal with just the extension to priority promises.
The E-Create rule creates a fresh promise p in the heap.
The priority of a priority promise corresponding to a regular
JavaScript promise is always 0, and starts out unresolved
with an empty list of callbacks.
The E-Then simply adds a new callback f to the tail of
the current list of (as yet unexecuted) callbacks of a promise,
where
⊕
denotes list append. Note that it doesn’t matter
whether the promise is currently resolved or not. This behav-
ior corresponds to the promise specication that requires
that such function f is never immediately executed even if
the promise is already resolved [13, 25.4, 22, 2.2.4].
Rule E-Resolve resolves an unresolved promise by updat-
ing its status to resolved (res(v)).
2.3.1 Scheduling
The nal rule E-Tick is the most involved and the core of our
semantics as it models the scheduler. It takes the ‘event loop’
expression
•
and reduces to a sequence of new expressions
53
剩余11页未读,继续阅读
hello-1984
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 彩虹rain bow point鼠标指针压缩包使用指南
- C#开发的C++作业自动批改系统
- Java实战项目:城市公交查询系统及部署教程
- 深入掌握Spring Boot基础技巧与实践
- 基于SSM+Mysql的校园通讯录信息管理系统毕业设计源码
- 精选简历模板分享:简约大气,适用于应届生与在校生
- 个性化Windows桌面:自制图标大全指南
- 51单片机超声波测距项目源码解析
- 掌握SpringBoot实战:深度学习笔记解析
- 掌握Java基础语法的关键知识点
- SSM+mysql邮件管理系统毕业设计源码免费下载
- wkhtmltox下载困难?找到正确的安装包攻略
- Python全栈开发项目资源包 - 功能复刻与开发支持
- 即时消息分发系统架构设计:以tio为基础
- 基于SSM框架和MySQL的在线书城项目源码
- 认知OFDM技术在802.11标准中的项目实践
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功