执行上下文和play框架中的将来链接

时间:2018-08-29 19:19:37

标签: multithreading scala playframework future nonblocking

我正在尝试解决必须实现目标的特定问题- 1)有一个过程部分,包括验证,数学计算和发送消息,仅当验证成功时才需要进行数学计算,类似地,只有在数学计算完成后才需要发送消息。 2)但我不能在此处编写阻塞代码,因为这是过程所花的时间,因此我为每个过程使用不同的执行上下文,并在将来进行链接

因此,我为application.config中的每个进程定义了不同的线程池

contexts {
  simple-db-lookups {
    executor = "thread-pool-executor"
    throughput = 1
    thread-pool-executor {
      fixed-pool-size = 20
    }
  }
  expensive-db-lookups {
    executor = "thread-pool-executor"
    throughput = 1
    thread-pool-executor {
      fixed-pool-size = 20
    }
  }
  db-write-operations {
    executor = "thread-pool-executor"
    throughput = 1
    thread-pool-executor {
      fixed-pool-size = 10
    }
  }

并通过控制器调用一个外观,而该外观反过来又使用了全面的外观

for{
result1 <- future1(call to validation)
result2 <- future2(result1) call to mathematical operation
} yield(result2)

即使在数学运算调用中,我也使用相同的构造

 future2(result1){

    result1 <- anotherMethodCallForMaths()
    result2 <- messagingCall(result1) //last future call
    }

anotherMethodCallForMaths{
implicit lazy val executionContext = <context for math op>
Future{
 logic
}(executionContext)
}

每种方法(messagingCall,anotherMethodCallForMaths和将来的验证调用)都使用它们自己的执行上下文,这样就不会有两个作业使用同一线程池

现在,当我执行测试时,从日志中可以清楚地看到

将来对验证和anotherMethodCallForMaths的调用正确地使用了在线程池中配置的线程数,而消息传递调用使用的是正确的线程池,但不限于所提及的线程数,并且正在使用/创建的线程数超过配置的数量线程。

这可能是问题所在,我已经尝试了多种方法来达到相同的目的,但目前尚无解决方法。

0 个答案:

没有答案