[ruby-dev:43834] new deadlock detection
ko1 proposed a new deadlock detection method with patch.
How it works
- "Thread waker" changes
sleeper
- Only compareing
living thread num
andsleeper
is needed for detection
Asset
- Deadlock detection code is more beautiful than currents.
Patch
patch is in mail (base64 encoded)
[ruby-core:37164] Enumerable#lazy
(1..100).map{|x| 長い文字列等を生成する作業 }.select{|x| それを選択する作業 }
等だと,まず Enumerable#map
を実行して中間配列を生成,そしてその配列を
Enumerable#select
に渡すのですが,長い文字列等を作り配列にするとかなりのメモリを消費するため,生成した物を中間配列を生成せずにそのまま次の
Enumerable#select
に渡したいよね,という話は前から上がっていた. (後述の rude_map もそれ)Enumerable#rude_map
なども良いが,見た目カッコ悪い.どうせなら別のEnumeratorを生成して,綺麗にどんなメソッドでも遅延評価できると良いのでは? という案もあった.このチケットはその案,
Enumerable#lazy
を実装し, (1..100).lazy.map{|x| 長い文字列等を生成する作業 }.select{|x| それを選択する作業 }
などで好きなEnumerableメソッドを遅延評価できる.Enumerable#lazy
は Enumerable::Lazy
クラスのオブジェクトを返します.Enumerable::Lazy
は Enumerable
のサブクラスで,Enumerable
をインクルードしています.そのためあなたはLazy
でもEnumerable
と同じメソッドを利用することができるそうです. (ただし一部のメソッドはLazy
で再実装されている物もあります)Ruby での実装 (動作を確認するための仮の実装) lazy.rb
あわせて読みたい #4653
Enumerable#rude_map
[ruby-core:37170] Literal Instantiation breaks Object Model
例えば
String.new
ではinitialize
呼ばれるのに,リテラルから生成した場合呼ばれないじゃねーか.とリテラル化するときもRubyレベルで定義されたinitialize呼ぶべきじゃないでしょうかー.というバグ(提案?)
バグには見えないし,対応する理由も特に見当たらないのでReject.奥義「パッチを書いてこい」
No comments:
Post a Comment