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しなければいけなかったりするのはちょっと。生成側で継承するようにするべきか。