Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading akka http的不同执行上下文和线程分配_Multithreading_Scala_Akka_Akka Http - Fatal编程技术网

Multithreading akka http的不同执行上下文和线程分配

Multithreading akka http的不同执行上下文和线程分配,multithreading,scala,akka,akka-http,Multithreading,Scala,Akka,Akka Http,不确定这个问题是否正确 我有一个akka http应用程序,它充当一些繁重计算的前端。它处理的请求在处理它们所需的时间上有所不同。有些在一秒钟内完成,有些则需要更多时间。计算完全是异步的,在任何时候都没有等待,我用未来完成请求,即: val spotsJsonF: Future[String] = spotsF.map(spots => DebugFormatter.produceJson(text, spots._1, spots._2, env)) complete(spotsJso

不确定这个问题是否正确

我有一个akka http应用程序,它充当一些繁重计算的前端。它处理的请求在处理它们所需的时间上有所不同。有些在一秒钟内完成,有些则需要更多时间。计算完全是异步的,在任何时候都没有等待,我用未来完成请求,即:

val spotsJsonF: Future[String] = spotsF.map(spots => DebugFormatter.produceJson(text, spots._1, spots._2, env))

complete(spotsJsonF.map { t => HttpEntity(ContentTypes.`application/json`, t) })
我的要求/假设:

  • 我需要最大限度地提高并行性,即在重载情况下不应拒绝连接
  • 如果服务忙的话,我可以忍受一些(甚至是小的)需要更长时间的请求
  • 我可以在重载下处理一些非常长的请求,只要它们在HTTP请求超时后不会对并行性造成太大影响
为此,我为繁重的计算提供了一个单独的执行上下文(即Scala的默认
ExecutionContext.global
),即它在与Akka http dispatcher使用的线程池不同的线程池上生成和修改
Future
s。我认为这将停止Akka线程上的计算,这样它就可以接受更多的连接。目前它是Akka的默认调度程序(my
reference.conf
为空):

但是,由于超时,Akka取消了请求后,长时间运行的计算会继续执行很长时间。在内核数量有限的情况下,这意味着拒绝请求的数量开始增加,即使不再需要启动此重载的计算

显然,我不知道如何正确管理这个应用程序中的线程


满足我的要求的最佳方式是什么?几个线程池-好/坏主意?我需要明确取消吗?在这一点上,使用Scala的未来可能不是最好的选择?

对我来说,这听起来并不是关于管理线程,将繁重的工作隔离到一个单独的调度程序,而是关于管理实际的处理

为了能够在工作中期停止一个长时间运行的流程,可以说,您需要将它分成更小的块,这样,如果不再需要它,您可以在中途中止它

actors的一种常见模式是让处理actor存储“到目前为止”的结果或将其作为消息发送给自己,这样它就可以对中间的“停止工作”消息做出反应,或者可能检查它是否处理了很长时间以至于应该中止。例如,触发工作负载的消息可以包含这样一个超时值,以允许“客户端”指定它


(这与处理
InterruptedException
线程基本上是一样的。在手动线程和阻塞应用程序中,isInterrupted
正确)

对我来说,这听起来并不是真正的管理线程,而是将繁重的工作隔离到一个单独的调度程序上,但是关于管理实际的处理

为了能够在工作中期停止一个长时间运行的流程,可以说,您需要将它分成更小的块,这样,如果不再需要它,您可以在中途中止它

actors的一种常见模式是让处理actor存储“到目前为止”的结果或将其作为消息发送给自己,这样它就可以对中间的“停止工作”消息做出反应,或者可能检查它是否处理了很长时间以至于应该中止。例如,触发工作负载的消息可以包含这样一个超时值,以允许“客户端”指定它


(这与处理
InterruptedException
线程基本相同。在手动线程和阻塞应用程序中正确地中断了

您是否考虑过为每个资源创建单独的参与者?它应该很容易扩展,将繁重的计算代理给其他节点,在这种情况下,主节点将仅用作路由器。我们不将其用作分布式应用程序,因为它必须在内存中保留非常繁重的(13G)结构,所以我们只将其部署在大型EC2实例上。您是否考虑过创建单独的参与者,每个资源一个?它应该很容易扩展,将繁重的计算代理给其他节点,在这种情况下,主节点将仅用作路由器。我们不将其用作分布式应用程序,因为它必须在内存中保留非常繁重的(13G)结构,所以我们只将其部署在大型EC2实例上
    "default-dispatcher": {
      "attempt-teamwork": "on",
      "default-executor": {
        "fallback": "fork-join-executor"
      },
      "executor": "default-executor",
      "fork-join-executor": {
        "parallelism-factor": 3,
        "parallelism-max": 64,
        "parallelism-min": 8,
        "task-peeking-mode": "FIFO"
      },
      "mailbox-requirement": "",
      "shutdown-timeout": "1s",
      "thread-pool-executor": {
        "allow-core-timeout": "on",
        "core-pool-size-factor": 3,
        "core-pool-size-max": 64,
        "core-pool-size-min": 8,
        "fixed-pool-size": "off",
        "keep-alive-time": "60s",
        "max-pool-size-factor": 3,
        "max-pool-size-max": 64,
        "max-pool-size-min": 8,
        "task-queue-size": -1,
        "task-queue-type": "linked"
      },
      "throughput": 5,
      "throughput-deadline-time": "0ms",
      "type": "Dispatcher"
    },