请求-响应内并发的协程

时间:2020-03-07 05:31:37

标签: multithreading web-services kotlin kotlin-coroutines

假设我正在运行一个简单的Web服务器,该服务器分配100个线程来处理传入的请求。当请求到来时,将分配一个线程并将其阻塞,直到有可用响应为止。响应可用后,将发送响应,并且线程再次空闲。

要满足一个请求,我需要进行2次数据库调用,并基本总结出结果:


    suspend fun getUserData(username: String): String = {
      val firstName = async { database1.findUser(username) } // a suspended function
      val lastName = async { database2.findUser(username) } // a suspended function
      return firstName.await() + lastName.await();
    }

假设我有一个main方法,该方法调用上述方法来处理请求:


    fun main(username) {
      runBlocking {
        return userData(username)
      }
    }

我的理解是,getUserData中的异步代码将在Default dispatcher with as many cores as CPUs.

上运行

这表明以下内容:

  • 除了我有处理请求的100个线程外,我还有另一个(较小的)约4-8个线程的线程池正在处理数据库调用。
  • 假设我有4个CPU,并假设每个数据库调用花费约750毫秒:如果我开始每秒接收50个请求,则处理该协同例程的4个线程将被4个请求阻塞,而其余44个则挂起,等待回应。

这引起了我的问题:

  1. 我的理解正确吗?这实际上是发生了什么,还是Default-Dispatcher中的4个线程管理一个事件循环,因此实际上可以同时处理大量IO,一次执行所有50个请求(假设db.findUser返回Future或其他内容) 。
  2. 有没有办法(使用固定的100个线程来处理请求响应,以及这些线程的阻塞性质),以便在同一线程上伪并行执行代码。由于这是受IO限制的,所以我正在寻找与NodeJS相似的事件循环模型,但要在同一线程上运行。我只想同时执行数据库调用,而不是顺序执行。

注意:我不是在寻找其他服务器/框架。相反,鉴于我已经拥有的东西,我很好奇我是否可以利用协程增加并发性。如果没有,我可以按顺序运行查询。

0 个答案:

没有答案