让我们讨论一下每2秒就有setInterval方法的JavaScript代码。我还有一个onblur动画事件用于一些控制。在出现onblur(+动画)的情况下,我可能会得到setInterval函数。
2
setInterval
onblur
异步编程意味着多线程吗?(以任何方式?)
q43xntqr1#
不。它的字面意思就是异步。理解异步编程和基于线程的编程之间的区别对于您作为一名程序员的成功至关重要。在传统的非线程环境中,当函数必须等待外部事件(如网络事件、键盘或鼠标事件,甚至时钟事件)时,程序必须“等待”直到该事件发生。在多线程环境中,许多单独的编程线程同时运行。(取决于CPU的数量和操作系统的支持,这可能是真的,也可能是复杂的调度算法造成的错觉)。因此,多线程环境很困难,并且涉及线程锁定彼此的内存以防止它们彼此溢出的问题。在异步环境中,单个进程线程始终运行,但由于事件驱动的原因,它也可能运行(这也是关键),从一个函数切换到另一个函数。当一个事件发生时,* 并且当当前运行的进程到达必须等待另一个事件的点时 *,JavaScript核心然后扫描其事件列表并交付下一个事件,以(形式上)不确定(但可能是确定的)的顺序发送到事件管理器。因此,事件驱动的异步编程避免了传统多线程编程的许多缺陷,如内存争用问题。由于事件处理的顺序不由您决定,因此可能仍存在争用条件,但它们很少,并且更易于管理。另一方面,由于事件处理程序在当前运行的函数到达空闲点之前不会传递事件,有些函数会使剩下的编程变得饥饿。例如,当人们愚蠢地在服务器上做大量繁重的数学运算时,Node.js就会发生这种情况--最好将这些运算放入一个小服务器中,然后节点“等待”发送答案。Node.js是一个很棒的事件交换机,但是任何花费超过100毫秒的事情都应该以客户机/服务器的方式处理。在浏览器环境中,DOM事件被视为自动事件点(必须如此,因为修改DOM会产生大量事件),但即使是这样,编写糟糕的Javascript也会使内核挨饿,这就是Firefox和Chrome都有这些“This script is has stopped responsing”中断处理程序的原因。
kqlmhetl2#
单线程事件循环是单线程语言中异步的一个很好的例子。这里的概念是,将doLater回调处理程序附加到eventLoop,然后eventLoop只是一个while(true),它检查是否满足每个doLater处理程序的特定时间戳,如果满足,则调用该处理程序。对于那些感兴趣的人,这里有一个single threaded event loop in JavaScript的简单(而且非常低效)的实现这并不意味着,如果没有任何类型的OS线程调度程序访问您的单个线程,您将被迫忙碌等待doLater回调。如果你有一个sleep调用,你可以只做sleep,直到下一个doLater处理程序,这是更有效的,因为你取消调度你的单个线程,让操作系统做其他事情。
doLater
eventLoop
while(true)
sleep
qvtsj1bj3#
1.异步编程并不意味着多线程。1.为了同时实现多个任务,我们在node js中使用了多线程和其他的事件循环体系结构。
x4shl7ld4#
只是在某种意义上说,它执行代码是随意的,并冒着竞争条件的风险。使用超时和间隔不会获得任何性能上的好处。然而,HTML5的WebWorkers确实允许在浏览器中实现真实的的多线程:http://www.html5rocks.com/en/tutorials/workers/basics/
tcomlyy65#
如果有回调函数,就必须有东西调用它。执行的单位是线程&所以,是的,其他线程必须调用回调函数,要么直接调用,要么通过排队等待对初始线程的异步过程调用。
5条答案
按热度按时间q43xntqr1#
不。它的字面意思就是异步。理解异步编程和基于线程的编程之间的区别对于您作为一名程序员的成功至关重要。
在传统的非线程环境中,当函数必须等待外部事件(如网络事件、键盘或鼠标事件,甚至时钟事件)时,程序必须“等待”直到该事件发生。
在多线程环境中,许多单独的编程线程同时运行。(取决于CPU的数量和操作系统的支持,这可能是真的,也可能是复杂的调度算法造成的错觉)。因此,多线程环境很困难,并且涉及线程锁定彼此的内存以防止它们彼此溢出的问题。
在异步环境中,单个进程线程始终运行,但由于事件驱动的原因,它也可能运行(这也是关键),从一个函数切换到另一个函数。当一个事件发生时,* 并且当当前运行的进程到达必须等待另一个事件的点时 *,JavaScript核心然后扫描其事件列表并交付下一个事件,以(形式上)不确定(但可能是确定的)的顺序发送到事件管理器。
因此,事件驱动的异步编程避免了传统多线程编程的许多缺陷,如内存争用问题。由于事件处理的顺序不由您决定,因此可能仍存在争用条件,但它们很少,并且更易于管理。另一方面,由于事件处理程序在当前运行的函数到达空闲点之前不会传递事件,有些函数会使剩下的编程变得饥饿。例如,当人们愚蠢地在服务器上做大量繁重的数学运算时,Node.js就会发生这种情况--最好将这些运算放入一个小服务器中,然后节点“等待”发送答案。Node.js是一个很棒的事件交换机,但是任何花费超过100毫秒的事情都应该以客户机/服务器的方式处理。
在浏览器环境中,DOM事件被视为自动事件点(必须如此,因为修改DOM会产生大量事件),但即使是这样,编写糟糕的Javascript也会使内核挨饿,这就是Firefox和Chrome都有这些“This script is has stopped responsing”中断处理程序的原因。
kqlmhetl2#
单线程事件循环是单线程语言中异步的一个很好的例子。
这里的概念是,将
doLater
回调处理程序附加到eventLoop
,然后eventLoop
只是一个while(true)
,它检查是否满足每个doLater
处理程序的特定时间戳,如果满足,则调用该处理程序。对于那些感兴趣的人,这里有一个single threaded event loop in JavaScript的简单(而且非常低效)的实现
这并不意味着,如果没有任何类型的OS线程调度程序访问您的单个线程,您将被迫忙碌等待
doLater
回调。如果你有一个
sleep
调用,你可以只做sleep
,直到下一个doLater
处理程序,这是更有效的,因为你取消调度你的单个线程,让操作系统做其他事情。qvtsj1bj3#
1.异步编程并不意味着多线程。
1.为了同时实现多个任务,我们在node js中使用了多线程和其他的事件循环体系结构。
线程是一系列代码指令,也是进程的子单元.
在多线程中,进程有多个线程。在单线程中,进程只有一个线程。
x4shl7ld4#
只是在某种意义上说,它执行代码是随意的,并冒着竞争条件的风险。使用超时和间隔不会获得任何性能上的好处。
然而,HTML5的WebWorkers确实允许在浏览器中实现真实的的多线程:http://www.html5rocks.com/en/tutorials/workers/basics/
tcomlyy65#
如果有回调函数,就必须有东西调用它。执行的单位是线程&所以,是的,其他线程必须调用回调函数,要么直接调用,要么通过排队等待对初始线程的异步过程调用。