异步编程是否意味着多线程?

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都有这些"此脚本已停止响应"中断处理程序.

  • 但这些不是线程.您已在浏览器端代码中向服务器发送了一条消息.*当调用返回*是一个事件时,你的代码应该拿起它并用它做一些事情.在等待的时候,eventloop会去处理其他事件.当您的事件返回时,eventloop会让您的回调完全控制单个进程线程,直到您通过到达回调结束,执行导致eventloop进展或创建新事件的内容来放弃它. (13认同)
  • 一个很好的答案,谢谢你以合理的行话方式解释 (8认同)
  • Trusktr:因为 node 是单线程的,所以你不应该使用你正在使用的进程来处理请求,也不要进行繁重的程序提升;您不应该使用相同的过程进行自然语言处理或图像处理;你应该在子进程中这样做。每个过程都需要时间;其他所有进程都将被阻塞,直到完成。如果在子进程中执行此操作,则可以释放“交换机”进程来处理 I/O。 (2认同)
  • Ajax 调用*是*客户端/服务器。 (2认同)

Ray*_*nos 7

单线程事件循环是在单线程语言中异步的一个很好的例子.

这里的概念是你将doLater回调处理程序附加到eventLoop.然后eventLoop只是while(true)检查是否满足每个doLater处理程序的特定时间戳,如果是,则调用处理程序.

对于那些感兴趣的人来说,这是JavaScript中单线程事件循环的一个天真(并且非常低效的玩具)实现

这意味着没有任何类型的OS线程调度程序访问您的单个线程,您被迫忙于等待doLater回调.

如果你有一个sleep电话,你可以做到sleep直到下一个doLater处理程序,这个处理程序更有效率,然后是繁忙的等待,因为你计划你的单个线程并让操作系统做其他事情.