How do I rewrite a for loop with a shared dependency using actors

Posted by Thomas Rynne on Stack Overflow See other posts from Stack Overflow or by Thomas Rynne
Published on 2010-03-22T19:05:16Z Indexed on 2010/03/22 19:41 UTC
Read the original article Hit count: 267

Filed under:
|
|

We have some code which needs to run faster. Its already profiled so we would like to make use of multiple threads. Usually I would setup an in memory queue, and have a number of threads taking jobs of the queue and calculating the results. For the shared data I would use a ConcurrentHashMap or similar.

I don't really want to go down that route again. From what I have read using actors will result in cleaner code and if I use akka migrating to more than 1 jvm should be easier. Is that true?

However, I don't know how to think in actors so I am not sure where to start.

To give a better idea of the problem here is some sample code:

case class Trade(price:Double, volume:Int, stock:String) {
  def value(priceCalculator:PriceCalculator) =
    (priceCalculator.priceFor(stock)-> price)*volume
}
class PriceCalculator {
  def priceFor(stock:String) = {
    Thread.sleep(20)//a slow operation which can be cached
    50.0
  }
}
object ValueTrades {

  def valueAll(trades:List[Trade],
      priceCalculator:PriceCalculator):List[(Trade,Double)] = {
    trades.map { trade => (trade,trade.value(priceCalculator)) }
  }

  def main(args:Array[String]) {
    val trades = List(
      Trade(30.5, 10, "Foo"),
      Trade(30.5, 20, "Foo")
      //usually much longer
    )
    val priceCalculator = new PriceCalculator
    val values = valueAll(trades, priceCalculator)
  }

}

I'd appreciate it if someone with experience using actors could suggest how this would map on to actors.

© Stack Overflow or respective owner

Related posts about actors

Related posts about scala