Concurrent programing explanation for akka beginers. 並行処理初心者のためのAkka入門 akka meetup 2014/09/28(日) http://connpass.com/event/8622/ このイベントの導入説明のために書かれました。 内容には、並行処理、アクターモデル、Akkaの機能の説明となっています。Read less
続き 前回 のJavaScirpt に続いて今回は Scala です。 以下を見ながらまとめました。 Scala 2.10.0 Futures and Promises - 1 - Starlight Scala 2.10.0 Futures and Promises - 2 - Starlight Scala の Future scala.concurrent.Future から見ていきます。 概要 Futureの生成(処理内容の登録)は Future コンパニオンオブジェクトの apply に処理を渡せばよい。 コードの見た目は Future { ... } になる。 小文字始まりの future { ... } はなくなる予定らしい Future を生成するとすぐに、implicit な ExecutionContext によってスレッドが生成され、実行開始される。もちろん自分で E
"Scala Future" で検索して出てくるFutureの解説は、Scala公式サイトのドキュメントを除いて大体こんな感じで紹介されてることが多い。 import scala.concurrent._ import ExecutionContext.Implicits.global Future { Thread.sleep(1000) println("hoge") } println("fuga") //-> // fuga // hoge こういうFuture.applyにThread.sleepやIOのblockingをする例って非常に悪いと思っている。まるで、Futureでsleepするのが普通のコードっぽく見えるじゃん。違うの、単に説明の時に楽だからsleepしてるだけなの。説明コードが短くてすむの。ちょっと使ってるだけ。プロダクトコードでsleepするのやめろ。うわあ!!
最後はFutureトレイトに関する操作をやりきる。 シリーズ目次 はじめに コンパニオンオブジェクト操作 インスタンス操作 おまけ Futureにハマる 変換 map (※要ExecutionContext、別スレッドでの実行) お馴染みの。結果を何かしら変換する際に。 val f: Future[String] = Future("hello") val ff: Future[Int] = f.map(_.size) println(Await.result(ff, Duration.Inf)) // 5 trait X trait A trait B extends A case class Foo(z: Int) extends X with B val f: Future[Foo] = Future{ Foo(1) } val fx: Future[X] = f.mapTo[X]
こういう人は、あとあと処理が詰まったり理解できない挙動が起きたりして困るので注意。 よくわからないけどコンパイル時に怒られるので import scala.concurrent.ExecutionContext.Implicits.global を書いている Future.apply は 「スレッドを立ち上げて非同期に実行する」と理解している 特に何も考えず Future 内で Thread.sleep をしている ExecutionContextとは Future#mapやFuture.applyにimplicitパラメータとして要求される*1ExecutionContextって何なのか? 何か渡さないといけないからとりあえず import scala.concurrent.ExecutionContext.Implicits.global と書いている人もいるんじゃないだろうか。 Ex
全操作やっていく前に、最低限Futureの動きやFutureと組み合わせてよく使うものをはじめに確認しておく。 なお、以下の記事とても勉強になりましたので併せて読むと良いかも。リンクさせて頂きます。 Scala ExecutionContextって何 / Futureはスレッド立ち上げじゃないよ その1 import scala.concurrent._ import ExecutionContext.Implicits.global import scala.concurrent.duration.Duration object Main extends App { val msg = "hello" val f: Future[String] = Future { Thread.sleep(1000) msg * 5 } println(f.isCompleted) // false
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く