相关疑难解决方法(0)

scala.concurrent.blocking的用例

我遇到了这个scala.concurrent.blocking方法,根据Scala文档,这是......

用于指定可能阻塞的代码段,允许当前的BlockContext调整运行时的行为.正确标记阻塞代码可以提高性能或避免死锁.

我有些疑惑:

  • 生成新线程的因素是什么?
  • 这是否仅适用于scala.concurrent.ExecutionContext.Implicits.global执行上下文或用户创建的执行上下文?
  • 如果我用blocking {... 包装任何可执行文件会发生什么}
  • 我们应该使用这个结构的任何实际用例.

scala scala-2.10

71
推荐指数
1
解决办法
1万
查看次数

scala.concurrent.blocking - 它实际上做了什么?

我花了一些时间学习Scala执行上下文,底层线程模型和并发的主题.您能解释一下scala.concurrent.blocking "调整运行时行为""可以提高性能或避免死锁"的方式,如scaladoc中所述?

文档中,它被作为一种等待api的手段,它不实现Awaitable.(也许只是长时间运行的计算应该被包装?).

它究竟是做什么的?

通过消息来源不容易背叛其秘密.

concurrency scala java.util.concurrent

47
推荐指数
1
解决办法
4438
查看次数

如何保证akka中forks的顺序性

我们正在为每个(小)传入的消息组创建一个actor链,以保证它们的顺序处理和管道(组通过公共id区分).问题是,我们的链叉,就像A1 -> (A2 -> A3 | A4 -> A5)我们要保证消息经历之间没有种族A2 -> A3A4 -> A5.传统的解决方案是阻止A1actor直接当前消息被完全处理(在一个子链中):

def receive { //pseudocode
    case x => ...
      val f = A2orA4 ? msg
      Await.complete(f, timeout)
}
Run Code Online (Sandbox Code Playgroud)

因此,应用程序中的线程数与处理中的消息数成正比,无论这些消息是活动的还是异步等待来自外部服务的某些响应.它使用fork-join(或任何其他动态)池工作大约两年,但当然不能使用固定池,并且在高负载的情况下极大地降低性能.更重要的是,它会影响GC,因为每个被阻塞的fork-actor都会保留冗余的先前消息的状态.

即使使用背压,它也会创建比收到的消息多N倍的线程(因为流中有N个顺序叉),这仍然很糟糕,因为一条消息的处理需要很长时间但CPU不多.所以我们应该处理更多的消息,因为我们有足够的内存.我提出的第一个解决方案 - 将链条线性化A1 -> A2 -> A3 -> A4 -> A5.还有更好的吗?

multithreading scala future akka

3
推荐指数
1
解决办法
219
查看次数

scala,spray,akka - java.lang.OutOfMemoryError:无法创建新的本机线程

在检查喷雾api的吞吐量时.

场景:25个并发用户

Os:免费BSD

内存:2GB

无核心:2

在大约13个并发用户中,我收到以下错误.

[ERROR] [06/29/2015 05:01:56.407] [default-akka.actor.default-dispatcher-2]     [ActorSystem(default)] Uncaught error from thread [default-akka.actor.default-dispatcher-2] shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled
java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:714)
    at scala.concurrent.forkjoin.ForkJoinPool.tryAddWorker(ForkJoinPool.java:1672)
    at scala.concurrent.forkjoin.ForkJoinPool.deregisterWorker(ForkJoinPool.java:1795)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:117)
Run Code Online (Sandbox Code Playgroud)

Akka和Spray Conf从默认值更改:

akka{
    tcp{
        register-timeout = 20s
    }
}

spray.can {
    request-timeout = 30 s
    bind-timeout = 30s
    unbind-timeout = 5s
    registration-timeout = 30s
}

http.spray.can {
    server{
        pipelining-limit = 50
    }
}
Run Code Online (Sandbox Code Playgroud)

导致OutOfMemmoryError的原因.从路由器actor抛出异常

scala akka spray

2
推荐指数
1
解决办法
2430
查看次数