Java Nodejs性能事件循环

Java Nodejs性能事件循环,java,javascript,multithreading,node.js,Java,Javascript,Multithreading,Node.js,由于其单线程事件循环,因此存在性能问题。我不是在征求意见,我是在征求力学方面的解释 一个线程开始处理一个请求,进行一些计算,并发现它需要从数据库中读取。这是异步完成的。没有延迟,线程可以继续。。。但如果没有这些数据,它该怎么办呢 A1回答“还不知道” 你还有别的要求吗 A1对我来说没什么意义。我可以想象一个客户机同时发出其他请求(比如在第一次访问站点时加载多个资源),但通常不会 A2当它抓取另一个请求时,就会丢失整个上下文。这个上下文保存在promise中,当数据到达时,promise将得到

由于其单线程事件循环,因此存在性能问题。我不是在征求意见,我是在征求力学方面的解释

一个线程开始处理一个请求,进行一些计算,并发现它需要从数据库中读取。这是异步完成的。没有延迟,线程可以继续。。。但如果没有这些数据,它该怎么办呢

  • A1回答“还不知道”
  • 你还有别的要求吗
A1对我来说没什么意义。我可以想象一个客户机同时发出其他请求(比如在第一次访问站点时加载多个资源),但通常不会

A2当它抓取另一个请求时,就会丢失整个上下文。这个上下文保存在promise中,当数据到达时,promise将得到满足,但是哪个线程处理这个promise呢

  • 以后再穿同样的线
  • B2一条不同的线
在B1情况下,您可能很幸运,一些相关数据可能仍在线程的缓存中,但如果DB请求需要几毫秒,那么增益就很低


案例B2实际上不是等同于上下文切换吗?

a:Node.js不会响应任何请求,除非您编写了主动发送响应的代码。该代码是同步运行还是异步运行并不重要。
客户机(甚至服务器的网络堆栈)无法知道或关心异步是否同时发生

B:只有一个Node.js线程,句号。
当响应到达Node.js代码中启动的异步操作时,Node.js事件循环线程中会引发一个事件,并调用相应的回调/处理程序。

Node.js基于C库

线程在内部用于伪造所有线程的异步性质 系统调用。libuv还使用线程来允许您, 要异步执行实际阻塞的任务,请执行以下操作: 生成线程并在完成后收集结果

一个线程开始处理一个请求,进行一些计算,并发现它需要从数据库中读取。这是异步完成的。没有延迟,线程可以继续。。。但如果没有这些数据,它该怎么办呢

将回调传递给DB模块的方法,并从作为事件侦听器调用的当前函数返回。事件循环将继续到队列中的下一个事件。
上下文可以在回调函数中作为函数的闭包进行访问。

注意:
B:
的答案并非如此,至少对于所有平台上的文件系统操作是如此。对于这些类型的操作,有一个线程池。但是,所有网络I/O都是使用epoll/kqueue/iocp/whatever在主线程上执行的。@mscdex:我指的是处理响应的Node.js线程。也许,但是“只有一个Node.js线程,period”(强调我的)有点误导。像“所有网络i/o只有一个node.js线程”这样的说法更清楚。我同意@mscdex的观点,不仅仅只有一个node.js线程,最好说所有用NodeJS编写的userland原生JavaScript代码都可能在一个线程上运行,除非您明确要求不要这样做。我想这篇文章的性能部分并不是关于线程缓存或上下文切换,而是关于在有限的线程池中处理多个请求(以防所有线程都被阻塞)。此外,文章不考虑其他java服务器架构,也不考虑NoDEJS服务器的低级别或外部瓶颈,这会导致不同的情况。@ Worde文章似乎很糟糕,我读了其他文章,但这是我现在能找到的第一个也是最大胆的。实际上,该图显示了一个nodejs线程和两个Java线程,其中有多个线程正在运行=>Java wins.。)