Akka ActorでPipeline
はじめに
Pipelineとは、例えば全体の処理をA, B, Cという処理に分割したとして、それぞれの処理で1つ又は複数のスレッドでもって処理を行う並行形式。私が良く知っている、CPUなんかは1Clockの処理を数十段に分けるPipelineな処理を行っているので、それと同じ要領である。
というのと、ScalaのActorを勉強するにつけ、「これActorで実装できるよね!」と思ったので実装してみた。
書いたコード
ideoneが死んでたのでgistにしてみたんだが、とても使いやすくて良い感じ。今後こっちにしよ
https://gist.github.com/ponkotuy/5379540
まぁAkka使ったことがあれば…分かるんジャマイカ?
キモ
ActorでPipeline的なことやる方法は幾らか思い付く。ただ、Main ThreadによってActorの繋がりを定義できる(つまりActorとActorの繋りをActorに書かない)のが必須条件だと考える。ので次の2パターンが考えられる
- 一旦MainThreadに結果を戻して次に投げる
- Actorに次どこ投げるか指示する
前者が優れているのは、Actorに全く手を加える必要が無い点で、実際最初は前者でやってみたんだが、どう頑張ってもインデントがPipelineの数だけ深くなったりと、コードが汚なくなってしまった。実際Scala勉強会で聞いてみたらあんまり良くない、とのこと。
という訳で今回取ったのは下のアプローチ。ただ実際には、勉強会で提案されたのは投げるMessageに行き先のリストを書いておく方法だったが、今回書いたのは、Actorの生成時に行き先を決めておく方法。理由は特に無かったのだが、書いてみるとやはりMessageで行き先決めた方が自由度高そう。
課題
まずPipeActorの継承がもっとスマートにできないかなーというのがある。引数設定したりsuperしなければいけなかったりするのはちょっと。生成側で継承するようにするべきか。