一般来说,围绕被动异步代码进行大量宣传,异步处理请求(play,akka,netty等)。 在以这种方式执行代码时,建议您不要在任何地方阻塞和使用异步库。 如果我理解这一点,这种方式不是为每个请求创建一个线程,而是为这些库带来的多个执行部分的线程执行器(请求的主要处理,服务执行器的异步调用,异步数据库驱动程序执行器等等)。 )
这种方式执行最终在多个线程中分裂(=在多个执行程序中)。 这些异步库是如何实现的,以便带来任何好处?因为在异步数据库驱动程序具有运行一个只等待DB回答的线程的执行程序的情况下,我认为它不会带来任何好处。我们最终会等待,只是通过创建额外的线程来做等待并没有任何帮助。或者是吗?
答案 0 :(得分:0)
根据我写https://github.com/jasync-sql/jasync-sql的经验,我可以告诉你,这是一个异步mysql驱动程序,在后台使用netty。
首先,当您对数据库进行sql查询时,没有任何线程被阻塞。相反,netty使用事件循环和java nio来使一个线程在许多套接字上侦听而不会阻塞。
如果您想要有关事件循环的一般信息,那么这是一个非常不错的视频:https://www.youtube.com/watch?v=8aGhZQkoFbQ
根据我的理解,在理想的应用程序中,线程的数量和内核的数量一样,它们永远不会在io上阻塞,只会执行CPU工作(计算)。因此,在这个理想的世界中,您将使用ForkJoinPool
进行所有操作。在实际场景中,我从未见过执行此操作的应用程序,也许只是超调服务。取而代之的是,您在某些池中通常有更多线程,但是它们通常等待工作并且不应阻塞。这样仍然可以具有很好的利用率。