Roy*_*mir 39 .net javascript jquery multithreading asynchronous
让我们谈谈每秒都有setInterval方法的JavaScript代码2.
我还有一个onblur控件的动画事件.
在onblur发生(+动画)的情况下,我可能会得到这个setInterval功能.
所以我的问题是:
异步编程是否意味着多线程?(以任何方式?)
我知道Javascript不是一种多线程语言.
所以...?
Elf*_*erg 76
不,它的意思是字面意思 - 异步.理解异步编程和基于线程的编程之间的区别对于您作为程序员的成功至关重要.
在传统的非线程环境中,当函数必须等待外部事件(例如网络事件,键盘或鼠标事件,甚至是时钟事件)时,程序必须等到该事件发生.
在多线程环境中,许多单独的编程线程同时运行.(根据CPU的数量和操作系统的支持,这可能确实如此,或者它可能是由复杂的调度算法创建的错觉).出于这个原因,多线程环境很难并且涉及线程锁定彼此的内存以防止它们相互超越的问题.
在异步环境中,单个进程线程一直在运行,但出于事件驱动的原因(也就是关键),它可能会从一个函数切换到另一个函数.当事件发生时,当当前正在运行的进程遇到必须等待另一个事件的点时,javascript核心会扫描其事件列表并以(正式)不确定(但可能是确定性的)顺序传递下一个事件,到活动经理.
因此,事件驱动的异步编程避免了传统的多线程编程的许多缺陷,例如内存争用问题.可能仍然存在竞争条件,因为处理事件的顺序并不取决于您,但它们很少且更易于管理.另一方面,因为事件处理程序在当前运行的函数到达空闲点之前不传递事件,所以某些函数可能会使编程的其余部分饿死.这种情况发生在Node.js中,例如,当人们愚蠢地在服务器中进行大量繁重的数学运算时 - 最好将其推入一个小型服务器,然后节点"等待"提供答案.Node.js是一个很棒的事件交换机,但是任何需要超过100毫秒的事情都应该以客户端/服务器的方式处理.
在浏览器环境中,DOM事件被视为自动事件点(它们必须是,修改DOM会传递大量事件),但即使是写得很糟糕的Javascript也会使核心匮乏,这就是为什么Firefox和Chrome都有这些"此脚本已停止响应"中断处理程序.
单线程事件循环是在单线程语言中异步的一个很好的例子.
这里的概念是你将doLater回调处理程序附加到eventLoop.然后eventLoop只是while(true)检查是否满足每个doLater处理程序的特定时间戳,如果是,则调用处理程序.
对于那些感兴趣的人来说,这是JavaScript中单线程事件循环的一个天真(并且非常低效的玩具)实现
这意味着没有任何类型的OS线程调度程序访问您的单个线程,您被迫忙于等待doLater回调.
如果你有一个sleep电话,你可以做到sleep直到下一个doLater处理程序,这个处理程序更有效率,然后是繁忙的等待,因为你计划你的单个线程并让操作系统做其他事情.
| 归档时间: |
|
| 查看次数: |
13319 次 |
| 最近记录: |