让我们谈谈每 2
秒有一个 setInterval
方法的 JavaScript 代码。
我还有一些控件的 onblur
动画事件。
在发生 onblur
的情况下(+ 动画),我可能会得到 setInterval
函数。
问题:
异步编程是否意味着多线程? (以任何方式?)
最佳答案
没有。它的字面意思就是它的意思——异步。了解异步编程和基于线程的编程之间的区别对于您作为程序员的成功至关重要。
在传统的非线程环境中,当函数必须等待外部事件(例如网络事件、键盘或鼠标事件,甚至是时钟事件)时,程序必须等待 直到那个事件发生。
在多线程环境中,许多单独的编程线程同时运行。 (根据 CPU 的数量和操作系统的支持,这可能是字面意思,也可能是复杂的调度算法造成的错觉)。出于这个原因,多线程环境是困难的,并且涉及线程锁定彼此的内存以防止它们彼此溢出的问题。
在异步环境中,单个进程线程始终运行,但由于事件驱动的原因(这是关键),它可能会从一个功能切换到另一个功能。当一个事件发生时,并且当当前运行的进程到达它必须等待另一个事件的点时,javascript 核心然后扫描它的事件列表并交付下一个事件,(正式地)不确定(但可能是确定性的)顺序,给事件管理器。
因此,事件驱动的异步编程避免了传统多线程编程的许多缺陷,例如内存争用问题。可能仍然存在竞争条件,因为处理事件的顺序不取决于您,但它们很少见并且更容易管理。另一方面,由于事件处理程序在当前运行的函数到达空闲点之前不会传递事件,因此某些函数可能会使其余的编程处于饥饿状态。例如,这发生在 Node.js 中,当人们愚蠢地在服务器上做大量繁重的数学运算时——最好将其插入一个小型服务器,然后节点“等待”提供答案。 Node.js 是一个很棒的事件小交换机,但任何超过 100 毫秒的事件都应该以客户端/服务器方式处理。
在浏览器环境中,DOM 事件被视为自动事件点(它们必须如此,修改 DOM 会产生大量事件),但即使是写得不好的 Javascript 也会让核心饿死,这就是为什么 Firefox 和Chrome 具有这些“此脚本已停止响应”中断处理程序。
关于javascript - 异步编程是否意味着多线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8963209/