这是我参与更文挑战的第 20 天,活动详情查看:更文挑战
javascript 的并发模型基于事件循环。该模型负责执行代码、收集和处理事件以及执行队列子任务。此模型与其他传统编程语言(如 C 和 Java)中的模型大不相同。
什么是并发?
并发指多个任务在同一时间段内同时发生。
并发意味着同时执行多个任务,但不一定在同一时间点执行。
无论我们喜欢与否,并发在现代编程中无处不在。网络中的多台计算机。在一台计算机上运行的多个应用程序本质上是并发的。
javascript 是单线程语言。此线程基于事件,并在事件发生时响应事件。
那么,它如何保证不阻塞其他功能执行呢?
这就要提到 javaScript 允许我们“同时”运行代码的三个功能:callback、promise 和 async/await。
promise 的链式结构和 async/await 的顺序结构让书写更容易。
因此在遇到并发或异步任务时,你很可能想到他们。
promise 有许多微妙之处,这使用户难以迅速找到错误根源,从而使您的代码难以维护。
由于这些隐藏起来的问题,我无数次发现自己非常希望在 javaScript(或 typescript)应用程序中找到更好的并发实现。
事实上,javaScript 没有任何真正的并发性,至少与其他语言提供的传统多线程或并行性没有什么相似之处。
执行和事件循环只有一条线程,通过该线程,Javascript 可以满足其多线程/平行主义的缺点。
JavaScript 事件循环依赖于消息传递并发,以非阻塞的方式执行调用堆栈中存在的任务。
或者更确切地说,它让我们感觉是非阻塞的。
在现实中,它确实会暂时阻止主线程。
事件循环是单线程和交错执行的,这使得它非常适合人们可能遇到的大多数并发案例,并且很少会想要用到多线程和真正的并行支持。