使用Scala-Akka框架阻止CLI调用
我对Akka和Scala比较陌生,但我想使用Akka作为一个通用框架,从各种web工具和cli命令中收集信息 我理解的一般原则是,在参与者模型中,不让参与者阻塞是非常可取的。对于http请求,有异步http客户端(比如Spray),这意味着我可以在Actor框架内异步处理请求 但是,我不确定在将参与者与现有的阻塞API调用(如scala ProcessBuilder/ProcessIO库)相结合时,最好的方法是什么。就发出这些CLI命令而言,我希望并发性相对较小,例如,在12核机器上最多执行10次并发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
让一个参与者管理这些CLI命令是否更好,将实际工作转移到根据需要创建的未来?或者仅仅维持一组独立的演员,由一个固定的播放机支持,会更干净吗?还是别的什么?来自Akka文档(): " 阻塞需要仔细管理 在某些情况下,执行阻塞操作是不可避免的,即让线程在不确定的时间内休眠,等待外部事件发生。例如,遗留的RDBMS驱动程序或消息传递API,以及典型情况下的潜在原因(网络)I/O发生在隐蔽处。面对这种情况,您可能会尝试在将来将阻塞调用封装起来,然后使用它,但这种策略太简单了:当应用程序在负载增加的情况下运行时,您很可能会发现瓶颈或内存或线程不足 “堵塞问题”的适当解决方案的非详尽清单包括以下建议:
- 在一个参与者(或由路由器[Java,Scala]管理的一组参与者)内执行阻塞调用,确保配置一个线程池,该线程池专用于此目的或足够大
- 在将来执行阻塞调用,确保在任何时间点上此类调用的数量都有上限(提交无限数量的此类任务将耗尽内存或线程限制)
- 在将来执行阻塞调用,为线程池提供适用于运行应用程序的硬件的线程数上限。 指定一个线程来管理一组阻塞资源(例如,驱动多个通道的NIO选择器),并在事件作为参与者消息发生时进行调度