[groonga-dev,01269] [ANN] rroonga 3.0.0

アーカイブの一覧に戻る

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




groonga-dev メーリングリストの案内
アーカイブの一覧に戻る