众所周知,JS使用事件循环来模拟单线程上的多线程.我对它的效率感到困惑。
假设我们想要读取一个文件,并且有一种使用linux系统函数的方法。据我所知,当read函数运行时,CPU将把作业发送给DMA,以便CPU可以做其他事情。
在其他真正的多线程语言(如C++ )中,我们创建一个新线程来读取文件。在DMA处理文件时,CPU实际上可以从该文件读取线程切换到执行其他一些工作。
但是在JS中,只有一个线程真正起作用。即使现在你把这个读取文件的工作放在一边,但是将来你必须在这个线程上完成这个工作。每当您想调用read函数时,您必须已经在线程的堆栈中了,即使CPU可以将作业留给DMA,线程仍然阻塞在那里,不能跳转到其他线程(因为只有一个线程,对吗?)
所以我认为JS的事件循环模型并不是真正的并发性,对吗?虽然它可以暂时搁置工作,但它仍然需要同样的时间来处理这项工作。总执行时间没有减少。我很困惑,请帮帮我。
发布于 2022-06-03 16:59:34
即使JavaScript是单线程的(由于Workers而不再是这样),您也可以要求操作系统同时执行许多I/O操作:
我们可以使用非阻塞I/O,它要求操作系统在数据出现之前让线程休眠,而不是使用阻塞I/O,我们可以使用非阻塞I/O,其中我们要求操作系统获取数据,并在它出现时通知我们,允许我们同时做其他事情。
例如,在node.js文件系统API中,每个函数都有几种形式:
因此,我们可以选择是想睡觉,直到数据在这里,或做其他的事情在这段时间。
值得注意的是,实际的硬件是非阻塞的。例如,直接储存器允许磁盘在不涉及CPU的情况下将数据放入内存,并在传输完成后中断CPU。
发布于 2022-06-03 16:17:26
您可以使用web工作者在javascript中运行真正的多线程。您不能在单线程环境中模拟多线程。异步和多线程不是一回事。您可以在javascript中运行异步,但不能运行多线程(没有WebWorkers)。
https://stackoverflow.com/questions/72492347
复制相似问题