Fiber: fiber storage・スケジューラ・backtrace 系の 14 メソッドを追加#3299
Conversation
実機で登場バージョンを確認し、それぞれ #@SInCE で分岐した。 3.0 で追加: Fiber.blocking? 現在の実行コンテキストがブロッキングか Fiber.schedule スケジューラ経由でノンブロッキングに実行 Fiber.scheduler 現在のスレッドのスケジューラ Fiber.set_scheduler スケジューラの設定 Fiber#backtrace ファイバーごとの実行スタック Fiber#backtrace_locations 同上 (Thread::Backtrace::Location の配列) Fiber#blocking? self がブロッキングなファイバーか 3.1 で追加: Fiber.current_scheduler ノンブロッキング時のみ返るスケジューラ 3.2 で追加: Fiber.[] / Fiber.[]= fiber storage の読み書き Fiber.blocking ブロックの実行中だけブロッキングにする Fiber#storage / #storage= fiber storage 全体の取得と設定 3.3 で追加: Fiber#kill ファイバーの終了 Fiber#storage と Fiber#storage= は getter/setter の対なので、 docs/HowToWriteMethodEntry.md にならって 1 つのエントリにまとめた。 Fiber.[] と Fiber.[]= は引数と説明が異なるため、Hash や Ractor の 既存エントリと同様に分けている。 あわせて Fiber.new のキーワード引数 (blocking: / storage:) をバージョンごとに 分岐して追加し、クラスの説明に「ノンブロッキングファイバーとスケジューラ」の 節を設けた。スケジューラ関連のメソッドは単体では説明しづらいため、この節から 参照する形にしている。Fiber.new が既定でノンブロッキングなファイバーを生成する 点は誤解しやすいので、節と blocking: の説明の両方で触れた。 rdoc と実機の挙動が食い違う箇所は実機に合わせた。 - Fiber#backtrace は終了後 nil ではなく [] を返す (3.1〜4.0 で確認) - Fiber#kill の返り値は nil ではなく self (kill 済みなら false) また Fiber.[] のキーは 3.4 以降 String も受け付けるため、その旨を #@SInCE 3.4 で 分けて書いている (Fiber.new(storage:) に渡す Hash のキーは 4.0 でも Symbol のみ)。 なお Fiber::Scheduler は Ruby では定数として定義されておらず rdoc 上の存在なので、 [c:...] のリンクにはせず本文で参照する形にした。 bitclust のデータベース生成を 2.7.0 / 3.0 / 3.1 / 3.2 / 3.3 / 3.4 / 4.0 で実行して エラーが出ないこと、および登録されるメソッドが 0 / 7 / 8 / 13 / 14 / 14 / 14 件と 追加バージョンどおりになることを確認済み。4.0 の静的 HTML も生成し、リンクが すべて解決されること (compileerror が出ないこと) を確認した。サンプルコードは すべて実機で実行して出力を確認している。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
レビューしました。385 行の大きな追加ですが、since の版分岐(3.0/3.1/3.2/3.3/3.4)・ 検証できた点(実機 3.0.7〜4.0.6 + 描画)
修正提案:
|
|
Ruby 3.0 の実機を用意できたので、版ゲートの根拠を取り直しました。
# ruby 3.0.7
p Fiber.new(blocking: true) {}.blocking? # => true
Fiber.new(storage: {a: 1}) {} # ~> ArgumentError: unknown keyword: :storagerdoc と挙動が異なる点の補足本文に書いた 2 点について、3.0 でも同じであることを確認しました。 1. rdoc の例には f = Fiber.new { Fiber.yield }
f.resume
f.resume
p f.alive? # => false
p f.backtrace # => []2.
なお 🤖 Generated with Claude Code |
Fiber#storage の「例: 取得」で
p Fiber.current.storage # => {key: 1}
としていたが、この Hash の inspect 表記は 3.4 からのもので、storage が
存在する 3.2 / 3.3 では {:key=>1} になる。同じファイルの backtrace の例と
同様に #@SInCE 3.4 / #@else で出し分けた。
3.2 / 3.3 / 3.4 / 4.0 でデータベースを生成し、3.3 以前では {:key=>1}、
3.4 以降では {key: 1} が出ることを確認済み。
追加した他の例は出力が数値・nil・bool のみで、この影響を受けない。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
レビューありがとうございます。ご指摘の 1 箇所を修正しました (a104095)。
|
|
修正(a104095)を確認しました。マージ可と考えます。 対応ありがとうございます。
3.0 実機での since 根拠の取り直しや、 🤖 Generated with Claude Code |
znz さんの suggestion 2 件を反映した。 - クラス説明の「Fiber::Scheduler のドキュメント」を、rdoc への リンク (https://docs.ruby-lang.org/en/4.0/Fiber/Scheduler.html) にした。 - Fiber.blocking? のシグネチャを `-> bool | Integer` から `-> false | 1` にした。返り値は実装上 false か 1 に固定されており (cont.c の rb_fiber_s_blocking_p が Qfalse か INT2NUM(blocking) を返す)、 3.0〜4.0 の実機でも false / 1 以外は返らないことを確認済み。 本文も「真を返す」から「1 を返す」に合わせた。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
リンク切れの指摘への対応。IO::Buffer は段階的に追加している途中なので、 未収録のものは収録する回までコードスパンにし、#@# コメントを残した。 - IO::Buffer#set_value / IO::Buffer.map (指摘のあった2件) - IO::Buffer.for (4箇所。うち2箇所は rurema#3301 由来) - IO::Buffer#locked (rurema#3295 由来)。LOCKED 定数の説明が 「[m:IO::Buffer#locked] を参照してください」だけだったので、 本 PR で追加する locked? で調べられる旨の説明に書き換えた - Fiber::Scheduler (rurema#3278 由来) は rdoc へのリンクにした (rurema#3299 と同じ扱い) あわせて、参考として指摘のあった IO::Buffer.new の説明を 「PAGE_SIZE より大きい場合」から「PAGE_SIZE 以上の場合」に修正した。 io_buffer.c は size >= RUBY_IO_BUFFER_PAGE_SIZE で判定しており、 実機でも 3.1〜4.0 のすべてで size == PAGE_SIZE のとき mapped? が true になる。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- [m:Kernel#caller] / [m:Kernel#caller_locations] (3箇所) は、caller と caller_locations が functions.md で module_function として定義されているため /method/Kernel/i/... を指してリンク切れになる。[m:Kernel?.caller] / [m:Kernel?.caller_locations] に修正した。rurema#3308 での同種の指摘を受けたもの。 - Fiber.scheduler は 3.0 から存在するが、その SEE が参照する Fiber.current_scheduler は 3.1 から (3.0.7 では respond_to? が false)。 3.0 のページでリンク切れになるため、SEE 行を分けて #@SInCE 3.1 で囲んだ。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
別 PR (#3308) のレビューで
|
|
追加の修正ありがとうございます。 3.0 / 4.0 で statichtml をビルドして compileerror 0・該当ページのリンク解決も確認済みです。マージ可と考えます。 ありがとうございました。 |
概要
Ruby 4.0 に存在するのにリファレンスに項目が無い [c:Fiber] のメソッド 14 個を追加しました。
あわせて [m:Fiber.new] のキーワード引数 (
blocking:/storage:) と、クラスの説明に「ノンブロッキングファイバーとスケジューラ」の節を追加しています。
追加したメソッド
Ruby 3.0 で追加:
Fiber.blocking?Fiber.scheduleFiber.schedulerFiber.set_schedulerFiber#backtraceFiber#backtrace_locationsFiber#blocking?Ruby 3.1 で追加:
Fiber.current_schedulerRuby 3.2 で追加:
Fiber.[]Fiber.[]=Fiber.blockingFiber#storageFiber#storage=Ruby 3.3 で追加:
Fiber#kill登場バージョンの確認
各メソッドが定義されているかを 2.7 / 3.1 / 3.2 / 3.3 / 3.4 / 4.0 の実機で確認し、
3.0 と 3.1 の切り分けは ruby/ruby の
cont.cでrb_define_singleton_methodが追加されたコミットと、それを含む最初のタグから判断しました。
Fiber.blocking…Introduce Fiber.blocking{} for bypassing the fiber scheduler(v3_2_0)Fiber.current_scheduler… v3_1_0 に含まれるコミットで追加Fiber#storage系 …Introduce Fiber#storage for inheritable fiber-scoped variables(v3_2_0)Fiber#kill…Add Fiber#kill, similar to Thread#kill.(v3_3_0)実機の挙動が rdoc と異なる点
記述は実機に合わせています。
Fiber#backtraceは終了後に空の配列を返します。rdoc の例には
# It is nil after the fiber is finishedとありますが、3.1 / 3.2 / 3.3 / 3.4 / 4.0 のいずれでも
[]が返りました。Fiber#killの返り値は rdoc ではnilとなっていますが、実際は self を返します(すでに kill 済みのファイバーに対しては false)。3.3 / 3.4 / 4.0 で確認しました。
Fiber.[]/Fiber.[]=のキーは 3.3 までは Symbol のみですが、3.4 以降は String も受け付けます (Symbol に変換されます)。
この差は
#@since 3.4で分岐しました。なお
Fiber.new(storage:)に渡す Hash のキーは 4.0 でも Symbol のみです。記述の方針
docs/HowToWriteMethodEntry.mdにならい、Fiber#storageとFiber#storage=はgetter/setter の対として 1 つのエントリにまとめました。
Fiber.[]とFiber.[]=は引数と説明が異なるため、[c:Hash] や [c:Ractor] の既存エントリと同様に分けています。
補足
Fiber.newは既定でノンブロッキングなファイバーを生成します(
Fiber.new {}.blocking?は false)。誤解しやすい点なので、クラスの説明の節と
blocking:の説明の両方で触れています。Fiber::Schedulerは Ruby では定数として定義されておらず(rdoc 専用)、るりまにも項目がありません。そのため
[c:...]のリンクにはせず、「Ruby 本体の Fiber::Scheduler のドキュメントを参照」という書き方にしています。
検証
rake check_format/check_blank_lines/check_indent_in_samplecode/check_single_space_indentbitclust update --markdowntree=manual/apiを 2.7.0 / 3.0 / 3.2 / 3.4 / 4.0 で実行し、エラーが出ないこと、および各バージョンで登録されるメソッドが上記の追加バージョンと
一致することを確認しました。
🤖 Generated with Claude Code