我刚刚开始阅读有关异步编程的全部内容,并会问下面的推理是否正确以及是否不是我的误解?
我的理解是,在谈论I / O时,异步编程主要是相关的,这是因为I / O事件的执行由一些其他执行环境处理,例如操作系统或数据库。 但是我也可以运行两个Node.js实例,例如一个需要高度响应的实例,我立即将执行长时间运行的Javascript进程传递给另一个Node.js实例,其中运行时间较长的进程可以锁定singel线程和只回发回调告诉响应服务器执行是否正常?创建运行异步javascript的外部执行环境的最常见方法是启动WebWorkers以避免阻塞单个三个? 也可以编写没有正面影响的异步代码,例如,如果所有异步代码都在singel Node.js实例上执行而不是传递给其他执行环境。这对我没有任何积极的影响,只会导致更复杂的程序逻辑,我的所有代码仍然需要在同一个环境中执行?
总而言之,异步编程就是避免在单个线程中执行任何操作,您只想将实际执行传递给其他进程?
我的推理是否正确?
答案 0 :(得分:2)
异步编程尤其,但不仅对I / O有用。
这个想法是I / O读写可能需要很长时间,而且并不总是需要等待它们。您可以在等待时继续执行代码。例如,您可以加载文件,执行查询并向另一个服务执行REST请求。您的节点应用程序可以同时异步启动所有这些,然后等待每个应用程序完成。
例如在PHP中,这很难完成,你将浪费时间等待文件加载,浪费更多时间直到执行查询,然后等待更多的REST请求,因为你无法启动他们在同一时间。
所以这是一个很大的优势,虽然它也有点理论上的。在实践中,您经常会发现需要输出一个请求/查询/文件作为下一个请求/查询/文件的输入。
节点本身不是单线程的(实际上,我真心希望它不是)。但是你不必自己实现多线程。此外,它可以多线程,尽管它不是必须的。即使在单线程和/或单核环境中,它仍然可以更快,因为您实际上可以暂停执行一个任务,直到完成其中一部分的I / O.就像我说的,在PHP中,你的脚本在等待数据库的响应时不能做任何事情,而在Node中你可以。
答案 1 :(得分:1)
关于异步Javascript的重要一点是你可以编写一个异步程序而不考虑线程等低级结构。在Javascript中,您可以通过使用回调和事件等机制将程序的执行链接在一起来处理复杂的并发逻辑。
关于异步编程的重要一点是,您可以处理可能需要花费大量时间执行的操作,例如打开文件,下载图像或计算Pi而不阻止其他进程执行其工作。
Javascript中并发的秘诀是"event loop",它允许在单线程环境中进行异步行为。