Mercurial > repos > other > SevenLanguagesInSevenWeeks
view 4-Scala/sizer/src/main/scala/example/sizer.scala @ 70:4198fa4e0df4
Add Scala code and notes
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sat, 14 Oct 2017 13:39:41 +0100 |
parents | |
children |
line wrap: on
line source
package example import scala.io._ import akka.actor.{Actor,ActorSystem,Props} object PageLoader { def getPageSize(url : String) : Int = { try { return Source.fromURL(url).mkString.length } catch { case e:Exception => return -1 } } } class ConcurrentActor extends Actor { def receive = { case (url, size) => println("Size for " + url + ": " + size) } } object Main { val urls = List( "https://www.amazon.com/", "https://twitter.com/", "https://www.google.co.uk/", "https://www.bbc.co.uk/news/" ) val system = ActorSystem("MySystem") val actor = system.actorOf(Props[ConcurrentActor], name="concurrent-actor") def timeMethod(method: () => Unit) = { val start = System.nanoTime method() val end = System.nanoTime println("+++ Method took " + (end - start) / 1000000000.0 + " seconds.") } def getPageSizeSequentially() = { for (url <- urls) { println("Size for " + url +": " + PageLoader.getPageSize(url)) } } def getPageSizeConcurrently() = { for (url <- urls) { // Send a message to the actor (which won't arrive until the PageLoader call completes) println(s"Sending message for $url") actor ! (url, PageLoader.getPageSize(url)) } } def main(args: Array[String]) { println("Sequential:") timeMethod { getPageSizeSequentially } println("Concurrent:") timeMethod { getPageSizeConcurrently } system.stop(actor) system.terminate() } }