Javascript 异步编程是否意味着多线程?
让我们讨论一下JavaScript代码,它每隔Javascript 异步编程是否意味着多线程?,javascript,jquery,multithreading,asynchronous,Javascript,Jquery,Multithreading,Asynchronous,让我们讨论一下JavaScript代码,它每隔2秒就有setInterval方法 我还有一个onblur动画事件用于一些控件 在出现onblur的情况下(+animation),我可能会得到setInterval函数 所以我的问题是: 异步编程是否意味着多线程?(以任何方式? 我知道Javascript不是一种多线程语言 所以…?只是因为它随意执行代码并冒着竞争条件的风险。使用超时和间隔不会给性能带来任何好处 但是,HTML5的WebWorkers允许在浏览器中实现真正的多线程: 单线程事件循环
2
秒就有setInterval
方法
我还有一个onblur
动画事件用于一些控件
在出现onblur
的情况下(+animation),我可能会得到setInterval
函数
所以我的问题是:异步编程是否意味着多线程?(以任何方式? 我知道Javascript不是一种多线程语言
所以…?只是因为它随意执行代码并冒着竞争条件的风险。使用超时和间隔不会给性能带来任何好处 但是,HTML5的WebWorkers允许在浏览器中实现真正的多线程:
单线程事件循环是单线程语言中异步的一个很好的例子 这里的概念是将
doLater
回调处理程序附加到eventLoop
。然后,eventLoop
只是一个while(true)
,用于检查是否满足每个doLater
处理程序的特定时间戳,如果满足,则调用该处理程序
对于那些感兴趣的人来说,这里是一个简单(而且效率极低)的玩具实现
这确实意味着,如果没有对单个线程的任何类型的OS线程调度程序访问,您将被迫在doLater
回调上忙着等待
如果你有一个
sleep
呼叫,你可以只做sleep
直到下一个doLater
处理程序,这比繁忙的等待更有效,因为你取消了单线程的调度,让操作系统做其他事情。如果有回调,就必须调用它。执行单元是线程&因此,是的,其他一些线程必须调用回调,要么直接调用,要么将一些异步过程调用排入对启动线程的队列。否。它的字面意思是异步。理解异步编程和基于线程编程之间的区别对于程序员的成功至关重要
在传统的非线程环境中,当函数必须等待外部事件(如网络事件、键盘或鼠标事件,甚至时钟事件)时,程序必须等待该事件发生
在多线程环境中,许多单独的编程线程同时运行。(取决于CPU的数量和操作系统的支持,这可能是真的,也可能是复杂的调度算法造成的错觉)。由于这个原因,多线程环境是困难的,并且涉及到线程相互锁定内存以防止它们相互溢出的问题
在非同步环境中,单个进程线程始终运行,但由于事件驱动的原因(这是关键),它可能会从一个函数切换到另一个函数。当一个事件发生时,当当前正在运行的进程到达必须等待另一个事件的点时,javascript核心会扫描它的事件列表,并以(正式的)不确定(但可能是确定的)顺序将下一个事件交付给事件管理器
因此,事件驱动的异步编程避免了传统多线程编程的许多缺陷,例如内存争用问题。比赛条件可能仍然存在,因为事件的处理顺序并不取决于你,但它们非常罕见,而且更容易管理。另一方面,由于事件处理程序在当前运行的函数到达空闲点之前不会传递事件,因此某些函数可能会耗尽其余的编程。例如,在Node.js中,当人们愚蠢地在服务器上做大量繁重的计算时,就会发生这种情况——最好将这些计算推到一个小服务器上,然后节点“等待”给出答案。Node.js是一个很好的小型事件交换机,但是任何超过100毫秒的事件都应该以客户机/服务器的方式处理
在浏览器环境中,DOM事件被视为自动事件点(它们必须是,修改DOM会传递大量事件),但即使编写得很糟糕的Javascript也会使内核变得匮乏,这就是为什么Firefox和Chrome都有这些“此脚本已停止响应”中断处理程序的原因
在单线程中,进程有单线程。不,异步性(ism?)不需要并行性。在封面下有线程,但作为程序员/语言使用者则不是。@Jason封面下没有线程。或者至少没有必要。不是我不相信你,但是,请引用。我假设各种javascript运行时使用多线程来产生异步行为。是否意外添加了.NET标记?似乎.NET标记与此问题无关(我在文章中没有看到任何.NET Framework内容)。完全有可能在以后由同一个线程调用回调。@Raynos怎么做?如果一个线程直接调用一个函数,它就叫做“调用”。如果回调被信号发送到某个输入循环的线程中,那么一定有什么东西使回调排队。驱动程序可以直接执行此操作,但它通常是一个内核线程。注意,t