显然,我不明白“异步”环境(例如 NodeJS)与“同步”环境的区别。
假设您被困在同步环境中。你的主循环不能说:
while(1) {
events << check_for_stuff_from_the_outside_world();
for e in events {e.process()}
}
这样做有什么问题,那不是异步环境,异步环境有何不同?
显然,我不明白“异步”环境(例如 NodeJS)与“同步”环境的区别。
假设您被困在同步环境中。你的主循环不能说:
while(1) {
events << check_for_stuff_from_the_outside_world();
for e in events {e.process()}
}
这样做有什么问题,那不是异步环境,异步环境有何不同?
是的,这或多或少是 Node.js 所做的,只是check_for_stuff_from_the_outside_world()
它实际上应该是; 而不是check_for_stuff_from_the_outside_world_plus_follow_on_stuff_from_previous_events()
; 并且您的所有事件也必须以这样一种方式编写,即它们不是完成它们的处理,而是简单地完成大部分工作,然后调用register_stuff_for_follow_up(follow_on_event)
. 换句话说,您实际上必须编写所有代码才能与此事件框架进行交互;它不能“透明地”完成,只有主循环需要担心它。
这就是为什么 Node.js 是 JavaScript 的重要部分。大多数语言都有预先存在的标准库(用于 I/O 等),它们不是建立在异步框架之上的。JavaScript 在期望每个托管环境都提供适合其自身目的的库方面相对不寻常(例如,浏览器 JS 的“标准库”可能与命令行 JS 环境的“标准库”几乎没有共同之处,例如作为 SpiderMonkey),这使 Node.js 可以灵活地设计与其事件循环一起工作的库。
看看维基百科页面上的例子: https ://en.wikipedia.org/wiki/Nodejs#Examples
注意代码是如何真正关注服务器的功能的——它应该做什么。Node.js 基本上说,“给我一个函数,告诉我当有东西从网络到达时你想做什么,当东西从网络到达时我们会调用它”,这样你就不必编写所有代码来处理管理网络连接等。
如果你曾经手工编写过网络代码,你就会知道你最终会一遍又一遍地编写相同的东西,但如果你想让它成为专业的质量,它也是不平凡的代码(在大小和复杂性方面) 、健壮、高性能和可扩展......(这是check_for_stuff_from_the_outside_world()
每个人都在提及的隐藏的复杂性。)因此 Node.js 负责为您完成所有这些工作(包括处理 HTTP 协议,如果您是使用 HTTP),您只需要编写服务器逻辑。
所以并不是说异步本身就更好。它恰好是适合他们提供的功能的自然模型。
您会在很多其他地方看到异步模型:基于事件的编程(在很多 GUI 中使用)、RPC 服务器(例如 Thrift)、REST 服务器,仅举几例。 .. 当然还有异步 I/O。;)