タグ

ブックマーク / unageanu.hatenablog.com (8)

  • Queueを使ったワーカースレッド - うなの日記

    Queueを使うとワーカースレッドが簡単に作れます。 ワーカースレッド(=仕事をするスレッド)は、キューから順番に仕事を取り出して実行するスレッドです。 これとは別に定期的に仕事を積むスレッドがいて、 ワーカースレッドは↑から仕事が積まれた場合にそれを取り出して実行します。 仕事がなければ、積まれるまで待つという動作をします。 ここで、キューへの仕事の追加と、キューからの仕事の取得は、別のスレッドで行われるため、同期制御が必要になります。 Queueを使うと、仕事を積む人とワーカースレッドの同期制御が内部で隠蔽されるため、外側での同期化なしにワーカースレッドを作ることができます。 QueueのAPIはpopとpushがあります。(他にもあるけど) Queue#popで要素を取り出します。このとき、queueが空の時、呼出元のスレッドは停止(ブロック)されます。 Queue#pushで要素を

    Queueを使ったワーカースレッド - うなの日記
  • Mutex - うなの日記

    Thread間の処理の同期にはMutexを使います。 Mutex#synchronizeで Mutexのロックの獲得 ブロックの処理を実行。 ロックの解除 を行います。Javaのsynchronizedブロックと似た感じで使えます。 require 'thread' m = Mutex.new ts = [] 3.times { |j| ts << Thread.start { m.synchronize { # ブロック内の処理が同期実行される。 5.times { |i| puts "thread-" << j.to_s << " : " << i.to_s sleep rand * 0.1 } } } } ts.each {|t| t.join } 実行結果です。ブロック内の処理が同期実行されています。 thread-0 : 0 thread-0 : 1 thread-0 : 2 t

    Mutex - うなの日記
  • トランザクション - うなの日記

    transactionを利用して、一連の更新処理をアトミックに実行します。 トランザクションを使う テーブル定義: CREATE TABLE kittens ( id int(11) NOT NULL auto_increment PRIMARY KEY, name VARCHAR(255), color VARCHAR(255), age int(4) ) TYPE = InnoDB ; サンプル: # 接続先サーバーの設定は省略 # ロガーの設定/ログを"debug.txt"に出力する。 ActiveRecord::Base.logger = Logger.new("debug.txt") class Kitten < ActiveRecord::Base def to_s return name end end # transaction を利用。 # ブロック実行後に変更がコミット

    トランザクション - うなの日記
  • Rakeの基本的な使い方まとめ - うなの日記

    Rakeの基的な使い方のまとめです。 インストールから、Rakefileの書き方、組み込みライブラリの使い方まで。 忘れたときに見返す用に。 Rakeって何? rubyで処理内容を定義できるビルドツール。「xmlでなくrubybuild.xmlを書くAnt」ですな。 ruby専用とかいうわけではなく、javaのビルドなんかにも(使おうと思えば)使えます。 処理内容をrubyで書けるので、ループとか条件分岐も思いのまま。 ただし、組み込みのタスクはちょい少ないので、ちょっとした作業させるにもコーディングが必要そうかな・・・。便利なライブラリがどっかにあったりするのかもですが・・・。 rakeツールのインストールと使い方 インストール rubyrubygems は事前にインストールされている前提で。 $ gem install rakerakeのgemをインストールするとrakeコマ

    Rakeの基本的な使い方まとめ - うなの日記
  • CouchDBにRubyでアクセスしてみる - うなの日記

    RubyでCouchDBにアクセスし、データの登録や取得を行うサンプルです。 CouchDBのインターフェイスはHTTPになっていて、GETやPUTで値の取得や登録ができます。 Ruby用のアクセスライブラリもいくつかあるようですが、HTTPでアクセスするだけならhttpclientでさくっと作れるよなー、ということで、このへんも参考にしつつ自作してみました。内部動作の把握にもなるしね。 require 'rubygems' require 'httpclient' require 'json/lexer' # CouchDBクライアント module CouchDB class Client def initialize(host, proxy=ENV["http_proxy"]) @host = host @client = HTTPClient.new( proxy, "http c

    CouchDBにRubyでアクセスしてみる - うなの日記
    a2ikm
    a2ikm 2010/11/02
    httpclientでさくっと作ってる
  • HTTPClient::Timeout - うなの日記

    httpclient付属の「HTTPClient::Timeout」を使うと、処理が指定された期間で完了したかチェックして、完了しない場合エラーとする機能を簡単に実現できます。 同様の機能を提供する標準添付のライブラリとしてtimeout.rbがありますが、これと比較して以下の点が改善されているとのこと。 timeout()が呼ばれるごとにスレッドを生成しない。1スレッドですべてのチェックを行う。 timeoutチェック用スレッド?の起動回数が少ない。 別のスレッドを起動してチェックする点は同じなので、 「C 言語レベルで実装され、Ruby のスレッドが割り込めない処理には無力」なのは同じ(のはず)。 また、Thread#criticalを設定してスレッド切り替えを抑制した状態でも利用できません。(ThreadErrorになります。) なお、強制キャンセルの仕組みは「Thread#rais

    HTTPClient::Timeout - うなの日記
  • Thread#valueでFutureパターン - うなの日記

    Futureパターンは、時間のかかる処理の非同期実行と処理完了の待ち合わせをスマートに行うためのパターンです。 非同期スレッドの開始や待ち合わせ処理を、非同期実行を開始する関数と引換券に隠蔽し、 呼び出し側や時間のかかる処理でスレッドを意識する必要なしに、処理を非同期実行できるようにします。 RubyではThread#valueを使うとさくっと作れます。 # 処理の実行結果を得るための引換券 class Future def initialize( t ) @t = t end # 処理の実行結果を得る。 # - 処理が実行完了していなければ実行完了を待ち、結果を返す。 # - 実行完了していれば、即座に結果を返す。 # - 処理の途中で例外となっていれば、例外をスロー def get_result @t.value end end # 指定したブロックを非同期実行し、 # 結果を取得する

    Thread#valueでFutureパターン - うなの日記
  • オブジェクトがnullやundefindでないか評価する。 - うなの日記

    ifで評価すれば一発で判定できます。 if ( !target ) { ... } // 以下のようにはしなくてもいい。 // if ( target == null || target == undefined ) { ... } 値ごとのifでの評価結果は次の表の通り。空文字列や0はfalse扱いなので注意。 値 ifで評価した結果 Object true undefined false null false 0 false 1 true -1 true ""(空文字列) false "a" true 配列 true ハッシュ true 確認してみます。 var stdout = document.getElementById("stdout"); // オブジェクト / null, undefind は false stdout.innerHTML += "null is " + (

    オブジェクトがnullやundefindでないか評価する。 - うなの日記
    a2ikm
    a2ikm 2009/07/06
    true/falseの判断
  • 1