首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javascript并发模型的效率

javascript并发模型的效率
EN

Stack Overflow用户
提问于 2022-06-03 16:07:47
回答 2查看 74关注 0票数 0

众所周知,JS使用事件循环来模拟单线程上的多线程.我对它的效率感到困惑。

假设我们想要读取一个文件,并且有一种使用linux系统函数的方法。据我所知,当read函数运行时,CPU将把作业发送给DMA,以便CPU可以做其他事情。

在其他真正的多线程语言(如C++ )中,我们创建一个新线程来读取文件。在DMA处理文件时,CPU实际上可以从该文件读取线程切换到执行其他一些工作。

但是在JS中,只有一个线程真正起作用。即使现在你把这个读取文件的工作放在一边,但是将来你必须在这个线程上完成这个工作。每当您想调用read函数时,您必须已经在线程的堆栈中了,即使CPU可以将作业留给DMA,线程仍然阻塞在那里,不能跳转到其他线程(因为只有一个线程,对吗?)

所以我认为JS的事件循环模型并不是真正的并发性,对吗?虽然它可以暂时搁置工作,但它仍然需要同样的时间来处理这项工作。总执行时间没有减少。我很困惑,请帮帮我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-03 16:59:34

即使JavaScript是单线程的(由于Workers而不再是这样),您也可以要求操作系统同时执行许多I/O操作:

我们可以使用非阻塞I/O,它要求操作系统在数据出现之前让线程休眠,而不是使用阻塞I/O,我们可以使用非阻塞I/O,其中我们要求操作系统获取数据,并在它出现时通知我们,允许我们同时做其他事情。

例如,在node.js文件系统API中,每个函数都有几种形式:

  • 同步API同步执行所有操作,阻塞事件循环,直到操作完成或失败。
  • 回调API异步执行所有操作,不阻塞事件循环,然后在完成或错误时调用回调函数(回调API使用底层Node.js线程池在事件循环线程上执行文件系统操作)。
  • 这些承诺API类似于回调API,但更易于使用。

因此,我们可以选择是想睡觉,直到数据在这里,或做其他的事情在这段时间。

值得注意的是,实际的硬件是非阻塞的。例如,直接储存器允许磁盘在不涉及CPU的情况下将数据放入内存,并在传输完成后中断CPU。

票数 2
EN

Stack Overflow用户

发布于 2022-06-03 16:17:26

您可以使用web工作者在javascript中运行真正的多线程。您不能在单线程环境中模拟多线程。异步和多线程不是一回事。您可以在javascript中运行异步,但不能运行多线程(没有WebWorkers)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72492347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档