显然,我不了解“异步”环境(如NodeJS)与“同步”环境的重要性。
假设您被困在同步环境中。你的主循环不能说:
while(1) {
events << check_for_stuff_from_the_outside_world();
for e in events {e.process()}
}
这样做有什么问题,那不是异步环境,异步环境有何不同?
答案 0 :(得分:2)
是的,这或多或少是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)
;并且你的所有活动也必须以这样的方式编写,即他们不是完成他们的处理,而是简单地完成他们的工作,然后拨打{{1}}。换句话说,您实际上必须编写代码的所有以与此事件框架进行交互;它不能“透明地”完成,只有主循环必须担心它。
这是Node.js为JavaScript的重要原因;大多数语言都有预先存在的标准库(用于I / O等),这些库不是构建在异步框架之上的。 JavaScript期望每个托管环境提供适合其自身目的的库(例如,浏览器JS的“标准库”可能与命令行JS环境的“标准库”几乎没有任何共同之处,这是相对不寻常的。作为SpiderMonkey),它为Node.js提供了设计与其事件循环一起工作的库的灵活性。
答案 1 :(得分:0)
查看维基百科页面上的示例: https://en.wikipedia.org/wiki/Nodejs#Examples
注意代码如何真正关注服务器的功能 - 它应该做什么。 Node.js基本上说,“给我一个功能,当你的东西从网络到达时你想要做什么,我们会在东西从网络到达时调用它”所以你不必将所有代码都写到处理网络连接等问题。
如果您曾经手工编写过网络代码,那么您知道最终会反复编写相同的内容,但如果您正在尝试制作网页代码,那么这也是非常重要的代码(无论是大小还是复杂程度)它具有专业品质,强大,高性能和可扩展......(这是每个人都在不断提及的check_for_stuff_from_the_outside_world()
隐藏的复杂性。)所以Node.js负责为你做所有这些(包括hadling) HTTP协议,如果你正在使用HTTP),你只需要编写服务器逻辑。
因此,异步本身并不是更好。它只是成为适合他们提供的功能的自然模型。
你会看到异步模型也出现在很多其他地方:基于事件的编程(用于很多GUI的东西),RPC服务器(例如,Thrift),REST服务器,只是为了命名一些......当然还有异步I / O. ;)