種類
- インスタンスメソッド (70)
- 文書 (15)
- クラス (11)
- 特異メソッド (11)
キーワード
-
NEWS for Ruby 2
. 6 . 0 (6) -
NEWS for Ruby 2
. 7 . 0 (5) -
NEWS for Ruby 3
. 0 . 0 (4) - [] (11)
- alive? (11)
- raise (15)
- resume (11)
-
thread
_ variable _ get (11) - transfer (11)
検索結果
先頭5件
-
Fiber
. yield(*arg = nil) -> object (39137.0) -
現在のファイバーの親にコンテキストを切り替えます。
...す。
コンテキストの切り替えの際に Fiber#resume に与えられた引数を yield メソッドは返します。
@param arg 現在のファイバーの親に渡したいオブジェクトを指定します。
@raise FiberError Fiber でのルートファイバーで呼ばれた場......合に発生します。
//emlist[例:][ruby]{
a = nil
f = Fiber.new do
a = Fiber.yield()
end
f.resume()
f.resume(:foo)
p a #=> :foo
//}... -
Fiber (38138.0)
-
ノンプリエンプティブな軽量スレッド(以下ファイバーと呼ぶ)を提供します。 他の言語では coroutine あるいは semicoroutine と呼ばれることもあります。 Thread と違いユーザレベルスレッドとして実装されています。
...係を持ちます。Fiber#resume を呼んだファイバーが親になり
呼ばれたファイバーが子になります。親子関係を壊すような遷移(例えば
自分の親の親のファイバーへ切り替えるような処理)はできません。
例外 FiberError が発生しま......す。
できることは
* Fiber#resume により子へコンテキストを切り替える
* Fiber.yield により親へコンテキストを切り替える
の二通りです。この親子関係は一時的なものであり
親ファイバーへコンテキストを切り替えた時点で解......るとその親にコンテキストが切り替わります。
なお標準添付ライブラリ fiber を require することにより、
コンテキストの切り替えに制限のない Fiber#transfer が使えるようになります。
任意のファイバーにコンテキストを切り......イバーが終了するとその親にコンテキストが切り替わります。
Ruby 3.1 から fiber を require しなくても、
コンテキストの切り替えに制限のない Fiber#transfer が使えます。
任意のファイバーにコンテキストを切り替えることがで... -
Fiber
# raise -> object (21080.0) -
selfが表すファイバーが最後に Fiber.yield を呼んだ場所で例外を発生させます。
...selfが表すファイバーが最後に Fiber.yield を呼んだ場所で例外を発生させます。
Fiber.yield が呼ばれていないかファイバーがすでに終了している場合、
FiberError が発生します。
引数を渡さない場合、RuntimeError が発生します。......指定します。
//emlist[例][ruby]{
f = Fiber.new { Fiber.yield }
f.resume
f.raise "Error!" # => Error! (RuntimeError)
//}
//emlist[ファイバー内のイテレーションを終了させる例][ruby]{
f = Fiber.new do
loop do
Fiber.yield(:loop)
end
:exit
end
p f.resume... -
Fiber
# raise(exception , message = nil , backtrace = nil) -> object (21080.0) -
selfが表すファイバーが最後に Fiber.yield を呼んだ場所で例外を発生させます。
...selfが表すファイバーが最後に Fiber.yield を呼んだ場所で例外を発生させます。
Fiber.yield が呼ばれていないかファイバーがすでに終了している場合、
FiberError が発生します。
引数を渡さない場合、RuntimeError が発生します。......指定します。
//emlist[例][ruby]{
f = Fiber.new { Fiber.yield }
f.resume
f.raise "Error!" # => Error! (RuntimeError)
//}
//emlist[ファイバー内のイテレーションを終了させる例][ruby]{
f = Fiber.new do
loop do
Fiber.yield(:loop)
end
:exit
end
p f.resume... -
Fiber
# raise(message) -> object (21080.0) -
selfが表すファイバーが最後に Fiber.yield を呼んだ場所で例外を発生させます。
...selfが表すファイバーが最後に Fiber.yield を呼んだ場所で例外を発生させます。
Fiber.yield が呼ばれていないかファイバーがすでに終了している場合、
FiberError が発生します。
引数を渡さない場合、RuntimeError が発生します。......指定します。
//emlist[例][ruby]{
f = Fiber.new { Fiber.yield }
f.resume
f.raise "Error!" # => Error! (RuntimeError)
//}
//emlist[ファイバー内のイテレーションを終了させる例][ruby]{
f = Fiber.new do
loop do
Fiber.yield(:loop)
end
:exit
end
p f.resume... -
Fiber
# transfer(*args) -> object (21066.0) -
自身が表すファイバーへコンテキストを切り替えます。
...すファイバーへコンテキストを切り替えます。
自身は Fiber#resume を呼んだファイバーの子となります。
Fiber#resume との違いは、ファイバーが終了したときや Fiber.yield が呼ばれたときは、
ファイバーの親へ戻らずにメインフ......ァイバーから呼び出した Fiber#resume メソッドの返り値として渡したいオブジェクトを指定します。
@return コンテキスト切り替えの際に、Fiber#resume メソッドに与えられた引数を返します。
@raise FiberError 自身が既に終了してい......をまたがる場合、
Fiber#resume を呼んだファイバーがその親か先祖である場合に発生します。
//emlist[例:][ruby]{
require 'fiber'
fr1 = Fiber.new do |v|
:fugafuga
end
fr2 = Fiber.new do |v|
fr1.transfer
:fuga
end
fr3 = Fiber.new do |v|
fr2.resume... -
Fiber
# alive? -> bool (21048.0) -
ファイバーが「生きている」時、真を返します。
...以下の場合です。
* まだ Fiber#resume されていない
* ブロック内の評価が終了していない (Fiber.yield が呼ばれていない)
//emlist[例:][ruby]{
fr = Fiber.new{
Fiber.yield
"a"
}
p fr.alive? # => true
fr.resume # Fiber.yieldで戻ってくる
p fr.alive? # =>... -
Fiber
# resume(*arg = nil) -> object (21048.0) -
自身が表すファイバーへコンテキストを切り替えます。 自身は resume を呼んだファイバーの子となります。
...ります。
ただし、Fiber#transfer を呼び出した後に resume を呼び出す事はでき
ません。
@param arg self が表すファイバーに渡したいオブジェクトを指定します。
@return コンテキストの切り替えの際に Fiber.yield に与えられた引数......を返します。ブロックの終了まで実行した場合はブロックの評価結果
を返します。
@raise FiberError 自身が既に終了している場合、コンテキストの切替が
Thread クラスが表すスレッド間をまたがる場合......また、Fiber#transfer を呼び出した後に resume を
呼び出した場合に発生します。
//emlist[例:][ruby]{
f = Fiber.new do
Fiber.yield(:hoge)
:fuga
end
p f.resume() #=> :hoge
p f.resume() #=> :fuga
p f.resume() #=> FiberError: dead fiber called
//}... -
NEWS for Ruby 3
. 0 . 0 (102.0) -
NEWS for Ruby 3.0.0 このドキュメントは前回リリース以降のバグ修正を除くユーザーに影響のある機能の変更のリストです。
...ith no special behavior.
C-API methods related to `$SAFE` have been removed.
16131 17136
* yield in singleton class definitions in methods is now a SyntaxError
instead of a warning. yield in a class definition outside of a method
is now a SyntaxError instead of a LocalJumpError. 1......4
* Fiber
* Fiber.new(blocking: true/false) allows you to create non-blocking execution contexts. 16786
* Fiber#blocking? tells whether the fiber is non-blocking. 16786
* Fiber#backtrace and Fiber#backtrace_locations provide per-fiber backtrace. 16815
* The limitation of Fiber#tran......ule M2; end
C.include M1
M1.include M2
p C.ancestors #=> [C, M1, M2, Object, Kernel, BasicObject]
//}
* Mutex
* `Mutex` is now acquired per-`Fiber` instead of per-`Thread`. This change should be compatible for essentially all usages and avoids blocking when using a scheduler. 16792
* Proc... -
Thread
# [](name) -> object | nil (48.0) -
name に対応したスレッドに固有のデータを取り出します。 name に対応するスレッド固有データがなければ nil を返し ます。
...を用いたスレッド固有の変数は
Fiber を切り替えると異なる変数を返す事に注意してください。
//emlist[][ruby]{
def meth(newvalue)
begin
oldvalue = Thread.current[:name]
Thread.current[:name] = newvalue
yield
ensure
Thread.current[:name] = oldv......数に与えるブロックがFiberを切り替える場合は動的スコープとしては
正しく動作しません。
//emlist[][ruby]{
f = Fiber.new {
meth(1) {
Fiber.yield
}
}
meth(2) {
f.resume
}
f.resume
p Thread.current[:name]
# => nil if fiber-local
# => 2 if thread-local (The......value 2 is leaked to outside of meth method.)
//}
Fiber を切り替えても同じ変数を返したい場合は
Thread#thread_variable_get と Thread#thread_variable_set
を使用してください。
Thread#[]=......value 2 is leaked to outside of meth method.)
//}
Fiber を切り替えても同じ変数を返したい場合は
Thread#thread_variable_get と Thread#thread_variable_set
を使用してください。
@see Thread#fetch, Thread#[]=... -
NEWS for Ruby 2
. 7 . 0 (42.0) -
NEWS for Ruby 2.7.0 このドキュメントは前回リリース以降のバグ修正を除くユーザーに影響のある機能の変更のリストです。
...異クラス構文での yield は警告を表示するようになりました。
これは deprecated です。 15575
この警告は「-W:no-deprecated」オプションで止められます。
//emlist{
def foo
class << Object.new
yield #=> warning: `yield' in class syntax will no......enumerator を生成する
Enumerator::Lazy#eagerメソッドが追加されました。 15901
* Enumerator::Yielder#to_procメソッドが追加され、Yielder オブジェクトを
直接他のメソッドのブロック引数として渡せるようになりました。 15.......lazy.with_index(1) { |it, index| puts "#{index}:#{it}" }.take(3).force
# => 1:a
# 2:b
# 3:c
//}
* Fiber
* 新規メソッド
* Fiber#raiseメソッドが追加され、Fiber#resumeのように
resumeして、さらに例外を発生させます。 10344
* File
*... -
Thread
# thread _ variable _ get(key) -> object | nil (42.0) -
引数 key で指定した名前のスレッドローカル変数を返します。
...変数(Fiber ローカル変数)と
異なり、Fiber を切り替えても同じ変数を返す事に注意してください。
例:
Thread.new {
Thread.current.thread_variable_set("foo", "bar") # スレッドローカル
Thread.current["foo"] = "bar" # Fiber ロー......カル
Fiber.new {
Fiber.yield [
Thread.current.thread_variable_get("foo"), # スレッドローカル
Thread.current["foo"], # Fiber ローカル
]
}.resume
}.join.value # => ['bar', nil]
この例の "bar" は Thread#thread_variable_get...