並行 (Concurrent) 処理を実装する方法としてスレッドは非常に強力なツールです。 スレッドを使えば同時に1つの処理しか行えない既存のプログラムに大きな修正を加えることなく、 並行処理を実装することが可能です。 またイベントとコールバックを複雑に組み合わせた非同期的なプログラムに比べて、 同期的なプログラム (例えばファイルの読み込みにコールバックが出てきたりしない普通のプログラム)は プログラムの流れを自然に書くことができ、 可読性・保守性・テスト、デバッグのしやすさの面で遥かに優れています。 スレッドを使うとプログラムをそれほど複雑・難読化にせずに並行処理が実装できます。 一方でスレッドを使った並行処理には欠点もあります。 欠点の1つは、スレッドモデルでは1つの処理に対して1つのスレッドを用意するので、 システムのスレッド数の上限で同時に行える処理の数が決まってしまう点です。
「DB負荷を減らしたいのでマスタテーブルはキャッシュして下さい><」だとか 「ファイルIOは重いのでテンプレートはキャッシュして下さい><」だとか 割と良く言われたりします。 オブジェクトのキャッシュは手軽な高速化の手段だと思われているようですが、並列性に気を使う必要性があったり、キャッシュされたオブジェクトを使用する側でも注意深く扱う必要が発生したりと、何かと不具合の温床になるので、大抵の場合なるべく別の方法を提案します。 それでも最終的にキャッシュした方がいい、という結論になるときもままあるので、Thread Safe で汎用的なCacheクラスを作成しました。 import java.util.concurrent.Callable; import java.util.concurrent.CancellationException; import java.util.concurr
はじめに マルチスレッドとキューについていろいろ書いてきている。とりあえず今回は、Rubyでマルチスレッド対応なQueueを考えてみる。 いろいろなご意見 皆様からいろいろなご意見を頂いたので、記載しておく ・キューの上限が必要なケースがよくわからなかった ・ディープクローンが発生するとパフォーマンスが悪くなる ・lock-freeなアルゴリズムがあるのでは これらについては、今後また書きたい rubyのマルチスレッド対応キュー Rubyでマルチスレッド対応Queueが欲しければ、以下のようにすればいい。 require 'thread' q = Queue.new q.enq( '123' ) q.deq() 既にクラスがあるので、それを利用すればいい... 自分で作る いや、あえて作る必要がないのであるが、作ってみる require 'thread' class MyQueue def
クラスの継承リスト: Thread < Object < Kernel < BasicObject 要約 スレッドを表すクラスです。スレッドとはメモリ空間を共有して同時に実行される制御の流れです。 Thread を使うことで並行プログラミングが可能になります。 実装 ネイティブスレッドを用いて実装されていますが、 現在の実装では Ruby VM は Giant VM lock (GVL) を有しており、同時に実行される ネイティブスレッドは常にひとつです。 ただし、IO 関連のブロックする可能性があるシステムコールを行う場合には GVL を解放します。その場合にはスレッドは同時に実行され得ます。 また拡張ライブラリから GVL を操作できるので、複数のスレッドを 同時に実行するような拡張ライブラリは作成可能です。 スケジューリング Ruby のスレッドスケジューリングはネイティブスレッドの
2012年1月20日金曜日 Thread-Local Storage in Ruby スレッド毎に局所的に固有のデータ領域を与える方法としてスレッド局所領域というものがある。http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E5%B1%80%E6%89%80%E8%A8%98%E6%86%B6まあおおまかなメリットはwikipediaなんかを参考にしていただきたいのだが、記憶領域としてはメモリよりL1/L2キャッシュのほうがはやいし、レジスタはさらにはやい。なので複数スレッド間で共有する必要がない資源はL1/L2キャッシュにのってくれたほうがいいよね、という話だ(多分)。Rubyのスレッドは1.9からOSのネイティブスレッドと1:1対応になったので、POSIXスレッドとかの実装と対応、といったことが可能なわけ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く