Kouhei Sutou
kou****@clear*****
2013年 3月 29日 (金) 14:49:20 JST
須藤です。 groongaのRubyバインディングであるrroonga 3.0.0 をリリースしま した。 Web: http://ranguba.org/ja/#about-rroonga ○ rroongaとは rroongaはRubyらしい書き方でgroongaを操作できることを重視しています。 同時に、groongaの速度をそのまま生かすことも大事にしています。 ○今回のリリースについて バージョン番号をみればわかる通り、groonga 3系に対応したリリー スです。 groongaに、実験的な機能としてgroongaのarrayテーブルをキューと して使える機能が入っていますが、それをrroongaから使えるように してあります。(rroongaでも実験的な機能扱いです。) これを使うと、groongaをジョブキューとして使うことができます。 例えば、以下のようなprovider.rbとconsumer.rbがあるとします。 provider.rbはキューにURLをpushしていきます。consumer.rbはキュー からpushされたレコードをpullし、URLを出力し、またpullします。 pullは新しくレコードがpushされるまでブロックします。 provider.rb: require "fileutils" require "groonga" FileUtils.mkdir_p("/tmp/db") if File.exist?("/tmp/db/db") Groonga::Database.open("/tmp/db/db") else Groonga::Database.create(:path => "/tmp/db/db") end Groonga::Schema.define do |schema| schema.create_table("CrawlQueue", :type => :array) do |table| table.short_text("url") end end queue = Groonga["CrawlQueue"] urls = [ "http://groonga.org/", "http://groonga.org/ja/", "http://mroonga.github.com/", "http://mroonga.github.com/ja/", "http://ranguba.org/", ] 100.times do |i| urls.each do |url| sleep(0.1) queue.push do |record| record.url = "#{url}?#{i}" end end end consumer.rb: require "groonga" Groonga::Database.open("/tmp/db/db") do queue = Groonga["CrawlQueue"] loop do url = nil queue.pull do |record| url = record.url record.delete end puts("consumer[#{Process.pid}]: #{url}") end end 使い方: まず、provider.rbを起動します。 % ruby provider.rb 次に、consumer.rbを複数起動します。 % ruby consumer.rb & % ruby consumer.rb & % ruby consumer.rb & すると、consumer.rbを起動した端末に以下のようにpushしたURLが 表示されるはずです。[...]の中はプロセスIDなのですが、異なる プロセスが順次キューからURLを取得しているのがわかります。 ... consumer[17707]: http://groonga.org/ja/?0 consumer[17708]: http://mroonga.github.com/?0 consumer[17706]: http://mroonga.github.com/ja/?0 consumer[17707]: http://ranguba.org/?0 consumer[17708]: http://groonga.org/?1 consumer[17706]: http://groonga.org/ja/?1 ... 注意点としてはpullでブロックしている最中はシグナルを処理でき ないという点です。そのため、キューが空でpullでブロックしてい るときはC-cで終了することができません。kill -KILLで削除する か、C-cしてからprovider.rbを起動してpullのブロックを解除して ください。pullとpullの間ではシグナルを処理できるのでC-cで終 了できます。 このあたりは、pull中でもいい感じにできないか検討しています。 ○ インストール % sudo gem install rroonga ○ チュートリアル irbを使ったrroongaのチュートリアルがあります。 http://ranguba.org/rroonga/ja/file.tutorial.html はじめての方はまずこちらを試してみてください。 2.1.3からの変更点は以下の通りです。 3.0.0: 2013-03-29 ================= 改善 ---- * groonga >= 3.0.2を必須にした。 * Groonga::Context#create_databaseがブロックをサポートした。 ブロックを渡すとブロックを抜ける時に作成したデータベース を閉じる。 * [実験的] Groonga::Array#pushを追加した。 * [実験的] Groonga::Array#pullを追加した。 * 閉じたオブジェクトのチェックを増やした。 [GitHub #8][KITAITI Makotoさんが報告] * Groonga::Context#restoreがブロックをサポートした。ブロッ クを渡すと実行したコマンドとそのレスポンスをブロックに渡 す。 感謝 ---- * KITAITI Makotoさん -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> (03-6231-7270) groongaサポート: http://groonga.org/ja/support/ パッチ採用はじめました: http://www.clear-code.com/recruitment/ コミットへのコメントサービスはじめました: http://www.clear-code.com/services/commit-comment.html