2010-12-25 [長年日記]
_ TupleSpaceとクリスマスに読みたい2冊の赤い本
メリークリスマス!
これは Ruby逆引きレシピAdvent Calendar の参加エントリです。
12/25担当のいがいがです。
前日の担当は @ukstudio さんの IRCでミサワをいつも側に… でした。
今日は「レシピ133:タプルスペースを介した分散処理を行いたい」のタプルスペースを紹介します。
タプルスペースは那須のKent Beck こと関さん作のライブラリRindaで実装されています。
「プロセス間で通信できる箱」といったイメージです。
タプルスペースという箱を作り、その中にタプル(オブジェクト)を出し入れできます。
タプルとしてArrayやHashなどさまざまなRubyのオブジェクトを扱うことが可能です。
これを使うと、プロセス間通信キューが簡単に実装できる優れものです。
■タプルスペースを動かしてみよう
レシピ先輩に教えてもらったサンプルコードでタプルスペースを起動します。
次に、irbを起動してこの箱にArrayオブジェクトを出し入れしてみましょう。
箱に入れるのは write, 取り出すのは take メソッドを使います。
takeして、その前にwriteでタプルスペースに格納したオブジェクトを取得できました。
(ちなみに、$ts.take(["message",nil])の引数の "message"はラベルのようなもので、
nilはそのラベルを持つオブジェクトの中からパターンマッチで取得が可能です。(nilは全マッチ))
■タプルスペースのメリット
拙作のLTタイマーTwYMもタプルスペースを使っています。
タイマーはtwitterやIRCなど複数のソースから表示メッセージを取得するため、
それぞれ別のプロセスとして起動してメッセージをタプルスペースにつめています。
表示アプリはタプルスペースからデータを取り出して表示しているだけで、
元のデータがIRCだったのかtwitterだったのかを意識しなくても済みます。
プロセスが別れているので、接続の調子が悪いときなどは
OSのshellから問題のプロセスだけを再起動して復活させることができます。
他の問題ないプロセスを動作させたまま問題対応できるのが利点です。
(運用中にタイマーとは別の画面でソースを書き換え、
取得するハッシュタグを切り替えたりなんてこともたまにしてます)
さらに、dRubyでお話ができれば誰でもタプルスペースを操作できるので、
Ruby1.8で起動しているタプルスペースにRuby1.9プロセスがwrite, take なんてこともできます。
これのおかげでタイマーもモジュールごとにRuby1.9対応を進められそうです。
プロセスが別れることのデメリットとしては処理のオーバーヘッドがあります。
処理速度を気にする場合はスレッドとQueueクラスの利用を検討してみてください。
■惚れさすタイトルをタイマーに流してみた
Ruby逆引きレシピAdvent Calendar 12月17日
「地獄のRuby札幌の「女に惚れさす逆引きレシピ集」 - 準二級.jp」から
ミサワネタにふれなくてはいけないような流れになっているので、
タイマーに惚れさすタイトルを流してみました。
所定のクラスへ詰めてタプルスペースへ格納するだけなので、
このような新しいソースへの対応が簡単で、タプルスペースを重宝してます。
■レシピ先輩への道
今日はタプルスペースがプロセス間通信する入れ物であることを紹介しました。
より詳しくは最近電子版も出版されたdRubyによる分散・Webプログラミング(初刷り)を参照ください。
また、タイマーの仕組みに関してはとちぎRuby会議でお話した資料を参照ください。
逆引きレシピ本には日々の生活を便利にしてくれるレシピがたくさん載っています。
困ったことがあったとき、目次を眺めてみると解決のヒントを教えてくれる頼りになるレシピ先輩です。
これは、本に限ったことでなく、日常の会話やtwitterでも同じことが起こっています。
「○○で困ってるのだけどいい方法ない?」
と聞くと、世界に散らばる先輩方がヒントを教えてくれたりします。
このAdventCalendarのように、レシピ先輩の活躍は本を飛び出し、世界へ広まっています。
ぜひあなたも時にはレシピ先輩の一員としてレシピを紹介してみてください。
また来年、どこかのブログであなたのレシピ先輩と会うことを楽しみにしています!
あと、ミサワ流れを作った @june29 さんはけしからんので、来年ももっとやるように。
4798119881
4274066096