Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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
使用Scala-Akka框架阻止CLI调用_Scala_Akka_Blocking - Fatal编程技术网

使用Scala-Akka框架阻止CLI调用

使用Scala-Akka框架阻止CLI调用,scala,akka,blocking,Scala,Akka,Blocking,我对Akka和Scala比较陌生,但我想使用Akka作为一个通用框架,从各种web工具和cli命令中收集信息 我理解的一般原则是,在参与者模型中,不让参与者阻塞是非常可取的。对于http请求,有异步http客户端(比如Spray),这意味着我可以在Actor框架内异步处理请求 但是,我不确定在将参与者与现有的阻塞API调用(如scala ProcessBuilder/ProcessIO库)相结合时,最好的方法是什么。就发出这些CLI命令而言,我希望并发性相对较小,例如,在12核机器上最多执行10

我对Akka和Scala比较陌生,但我想使用Akka作为一个通用框架,从各种web工具和cli命令中收集信息

我理解的一般原则是,在参与者模型中,不让参与者阻塞是非常可取的。对于http请求,有异步http客户端(比如Spray),这意味着我可以在Actor框架内异步处理请求

但是,我不确定在将参与者与现有的阻塞API调用(如scala ProcessBuilder/ProcessIO库)相结合时,最好的方法是什么。就发出这些CLI命令而言,我希望并发性相对较小,例如,在12核机器上最多执行10次并发CLI调用


让一个参与者管理这些CLI命令是否更好,将实际工作转移到根据需要创建的未来?或者仅仅维持一组独立的演员,由一个固定的播放机支持,会更干净吗?还是别的什么?

来自Akka文档():

" 阻塞需要仔细管理

在某些情况下,执行阻塞操作是不可避免的,即让线程在不确定的时间内休眠,等待外部事件发生。例如,遗留的RDBMS驱动程序或消息传递API,以及典型情况下的潜在原因(网络)I/O发生在隐蔽处。面对这种情况,您可能会尝试在将来将阻塞调用封装起来,然后使用它,但这种策略太简单了:当应用程序在负载增加的情况下运行时,您很可能会发现瓶颈或内存或线程不足

“堵塞问题”的适当解决方案的非详尽清单包括以下建议:

  • 在一个参与者(或由路由器[Java,Scala]管理的一组参与者)内执行阻塞调用,确保配置一个线程池,该线程池专用于此目的或足够大
  • 在将来执行阻塞调用,确保在任何时间点上此类调用的数量都有上限(提交无限数量的此类任务将耗尽内存或线程限制)
  • 在将来执行阻塞调用,为线程池提供适用于运行应用程序的硬件的线程数上限。 指定一个线程来管理一组阻塞资源(例如,驱动多个通道的NIO选择器),并在事件作为参与者消息发生时进行调度
第一种可能性特别适合于本质上是单线程的资源,如数据库句柄,传统上一次只能执行一个未完成的查询,并使用内部同步来确保这一点。常见的模式是为N个参与者创建一个路由器,每个参与者包装一个DB连接和句柄发送到路由器的查询。然后必须调整数字N以获得最大吞吐量,这取决于部署在哪个硬件上的DBMS。”