Scala中的并发Akka代理

Scala中的并发Akka代理,scala,akka,agent,Scala,Akka,Agent,我现在正在从事一个scala项目,我决定在actor模型上使用Akka的代理库,因为它允许一种更实用的并发方法。但是,我在一次运行多个不同的代理时遇到了一个问题。看来我只能同时运行三到四个代理了 import akka.actor._ import akka.agent._ import scala.concurrent.ExecutionContext.Implicits.global object AgentTester extends App { // Create the system

我现在正在从事一个scala项目,我决定在actor模型上使用Akka的代理库,因为它允许一种更实用的并发方法。但是,我在一次运行多个不同的代理时遇到了一个问题。看来我只能同时运行三到四个代理了

import akka.actor._
import akka.agent._
import scala.concurrent.ExecutionContext.Implicits.global

object AgentTester extends App {
// Create the system for the actors that power the agents
implicit val system = ActorSystem("ActorSystem")

// Create an agent for each int between 1 and 10
val agents = Vector.tabulate[Agent[Int]](10)(x=>Agent[Int](1+x))

// Define a function for each agent to execute
def printRecur(a: Agent[Int])(x: Int): Int = {
    // Print out the stored number and sleep.
    println(x)
    Thread.sleep(250)

    // Recur the agent
    a sendOff printRecur(a) _

    // Keep the agent's value the same
    x
}

// Start each agent
for(a <- agents) {
    Thread.sleep(10)
    a sendOff printRecur(a) _
}
}
导入akka.actor_
进口akka.代理_
导入scala.concurrent.ExecutionContext.Implicits.global
对象代理程序扩展应用程序{
//为为代理提供动力的参与者创建系统
隐式val系统=ActorSystem(“ActorSystem”)
//为1到10之间的每个int创建一个代理
val agents=Vector.表格[Agent[Int]](10)(x=>Agent[Int](1+x))
//为每个代理定义一个要执行的函数
def printRecur(a:Agent[Int])(x:Int:Int={
//打印出存储的号码并睡眠。
println(x)
线程。睡眠(250)
//重现代理人
a发送打印重现(a)_
//保持代理的值不变
x
}
//启动每个代理

对于(a我猜你是在一个4核的机器上运行的,这就是为什么你只看到数字1-4的部分原因。这里最重要的是你使用的是默认执行上下文,我猜你的系统使用的是一个只有4个线程的线程池(每个核心一个线程).按照您以这种递归方式编写的方式,我猜前4个代理永远不会放弃线程,它们是唯一可以打印任何内容的代理

您可以通过删除以下行轻松解决此问题:

import scala.concurrent.ExecutionContext.Implicits.global
并在创建
ActorSystem

import system.dispatcher
这将使用actor系统的默认调度程序,它是一个fork-join调度程序,似乎与您在示例中导入的默认执行上下文没有相同的问题


您也可以考虑使用<代码>发送<代码>,而不是<代码> sOnOffs//Cube >,因为这将使用在构建代理时可用的执行上下文。当他们有明确地想要使用另一个执行上下文的情况时,我认为会使用<代码> SDEOFFE/<代码>。有点不同,但是换掉了进口。谢谢!