別のキーワード
キーワード
- ConditionVariable (12)
- Enumerator (12)
- Fiber (12)
- Location (12)
- Monitor (12)
- Queue (12)
- SizedQueue (12)
- Thread (12)
- WIN32OLE (12)
検索結果
-
Thread
:: ConditionVariable (11049.0) -
スレッドの同期機構の一つである状態変数を実現するクラスです。
...変数を実現するクラスです。
以下も ConditionVariable を理解するのに参考になります。
https://ruby-doc.com/docs/ProgrammingRuby/html/tut_threads.html#UF
=== Condition Variable とは
あるスレッド A が排他領域で動いていたとします。スレッド A......tex = Mutex.new
cv = ConditionVariable.new
a = Thread.start {
mutex.synchronize {
...
while (条件が満たされない)
cv.wait(mutex)
end
...
}
}
b = Thread.start {
mutex.synchronize {
# 上の......@q が空になった場合、
あるいは満タンになった場合に Condition Variable を使って wait しています。
require 'thread'
class TinyQueue
def initialize(max=2)
@max = max
@full = ConditionVariable.new
@empty = ConditionVariable.new
@mutex =... -
Thread
:: SizedQueue (11035.0) -
サイズの最大値を指定できる Thread::Queue です。
...る Thread::Queue です。
=== 例
283 より。q をサイズ 1 の SizedQueue オブジェクトに
することによって、入力される行と出力される行が同じ順序になります。
q = [] にすると入力と違った順序で行が出力されます。
require 'thread'......q = SizedQueue.new(1)
th = Thread.start {
while line = q.pop
print line
end
}
while l = gets
q.push(l)
end
q.push(l)
th.join... -
Thread
:: Queue (11025.0) -
Queue はスレッド間の FIFO(first in first out) の通信路です。ス レッドが空のキューを読み出そうとすると停止します。キューになんら かの情報が書き込まれると実行は再開されます。
...と実行は再開されます。
最大サイズが指定できる Queue のサブクラス Thread::SizedQueue も提供されています。
=== 例
require 'thread'
q = Queue.new
th1 = Thread.start do
while resource = q.pop
puts resource
end
end
[:resource1, :resourc......e2, :resource3, nil].each{|r|
q.push(r)
}
th1.join
実行すると以下のように出力します。
$ ruby que.rb
resource1
resource2
resource3... -
Thread (6131.0)
-
スレッドを表すクラスです。スレッドとはメモリ空間を共有して同時に実行される制御の流れです。 Thread を使うことで並行プログラミングが可能になります。
...して同時に実行される制御の流れです。
Thread を使うことで並行プログラミングが可能になります。
=== 実装
ネイティブスレッドを用いて実装されていますが、
現在の実装では Ruby VM は Giant VM lock (GVL) を有しており、同時......できるので、複数のスレッドを
同時に実行するような拡張ライブラリは作成可能です。
=== スケジューリング
Ruby のスレッドスケジューリングはネイティブスレッドのそれを利用しています。
よって詳細はプラットフォー......だ
しその例外で終了するスレッドを Thread#join で待っている他の
スレッドがある場合、その待っているスレッドに対して、同じ例外が再度
発生します。
begin
t = Thread.new do
Thread.pass # メインスレッドが確実にjoinす... -
Thread
:: ConditionVariable (3049.0) -
スレッドの同期機構の一つである状態変数を実現するクラスです。
...変数を実現するクラスです。
以下も ConditionVariable を理解するのに参考になります。
https://ruby-doc.com/docs/ProgrammingRuby/html/tut_threads.html#UF
=== Condition Variable とは
あるスレッド A が排他領域で動いていたとします。スレッド A......tex = Mutex.new
cv = ConditionVariable.new
a = Thread.start {
mutex.synchronize {
...
while (条件が満たされない)
cv.wait(mutex)
end
...
}
}
b = Thread.start {
mutex.synchronize {
# 上の......@q が空になった場合、
あるいは満タンになった場合に Condition Variable を使って wait しています。
require 'thread'
class TinyQueue
def initialize(max=2)
@max = max
@full = ConditionVariable.new
@empty = ConditionVariable.new
@mutex =... -
Thread
:: Backtrace :: Location (3035.0) -
Ruby のフレームを表すクラスです。
...Ruby のフレームを表すクラスです。
Kernel.#caller_locations から生成されます。
//emlist[例1][ruby]{
# caller_locations.rb
def a(skip)
caller_locations(skip)
end
def b(skip)
a(skip)
end
def c(skip)
b(skip)
end
c(0..2).map do |call|
puts call.to_s
end
//}
例1の実......行結果:
caller_locations.rb:2:in `a'
caller_locations.rb:5:in `b'
caller_locations.rb:8:in `c'
//emlist[例2][ruby]{
# foo.rb
class Foo
attr_accessor :locations
def initialize(skip)
@locations = caller_locations(skip)
end
end
Foo.new(0..2).locations.map do |call|
puts call.to......_s
end
//}
例2の実行結果:
init.rb:4:in `initialize'
init.rb:8:in `new'
init.rb:8:in `<main>'
=== 参考
* Ruby VM アドベントカレンダー #4 vm_backtrace.c: https://www.atdot.net/~ko1/diary/201212.html#d4... -
Thread
:: SizedQueue (3035.0) -
サイズの最大値を指定できる Thread::Queue です。
...る Thread::Queue です。
=== 例
283 より。q をサイズ 1 の SizedQueue オブジェクトに
することによって、入力される行と出力される行が同じ順序になります。
q = [] にすると入力と違った順序で行が出力されます。
require 'thread'......q = SizedQueue.new(1)
th = Thread.start {
while line = q.pop
print line
end
}
while l = gets
q.push(l)
end
q.push(l)
th.join... -
Thread
:: Queue (3025.0) -
Queue はスレッド間の FIFO(first in first out) の通信路です。ス レッドが空のキューを読み出そうとすると停止します。キューになんら かの情報が書き込まれると実行は再開されます。
...と実行は再開されます。
最大サイズが指定できる Queue のサブクラス Thread::SizedQueue も提供されています。
=== 例
require 'thread'
q = Queue.new
th1 = Thread.start do
while resource = q.pop
puts resource
end
end
[:resource1, :resourc......e2, :resource3, nil].each{|r|
q.push(r)
}
th1.join
実行すると以下のように出力します。
$ ruby que.rb
resource1
resource2
resource3... -
Fiber (65.0)
-
ノンプリエンプティブな軽量スレッド(以下ファイバーと呼ぶ)を提供します。 他の言語では coroutine あるいは semicoroutine と呼ばれることもあります。 Thread と違いユーザレベルスレッドとして実装されています。
...ます。
他の言語では coroutine あるいは semicoroutine と呼ばれることもあります。
Thread と違いユーザレベルスレッドとして実装されています。
Thread クラスが表すスレッドと違い、明示的に指定しない限り
ファイバーのコンテ......ストを切り替えた時点で解消されます。
ファイバーが終了するとその親にコンテキストが切り替わります。
Ruby 3.1 から fiber を require しなくても、
コンテキストの切り替えに制限のない Fiber#transfer が使えます。
任意のフ......きます。
=== 例外
ファイバー実行中に例外が発生した場合、親ファイバーに例外が伝播します。
//emlist[例:][ruby]{
f = Fiber.new do
raise StandardError, "hoge"
end
begin
f.resume # ここでも StandardError が発生する。
rescue => e
p e.message #... -
WIN32OLE (65.0)
-
OLEオートメーションサーバをRubyで操作するためのクラスです。
...OLEオートメーションサーバをRubyで操作するためのクラスです。
Windowsの多くのアプリケーションやライブラリは、COMと呼ばれるAPI群を利用
して他のプログラムから操作できます。WIN32OLEがサポートしているのは、
COMのAPIの......は、OLEオートメーションサーバが提供するメソッドやプ
ロパティ(Rubyの属性に対応)をスクリプトから呼び出す手段を提供します。
呼び出しには、Rubyのオブジェクトと同様にオブジェクトに続けて「.」とメソッ
ド名、必......ェイスします。このため、
ruby 1.9以降のRubyのThreadとネイティブスレッドが1対1で対応する実行環境
ではスレッドをまたがる呼び出しはエラーとなります。
excel = WIN32OLE.new('Excel.Application')
Thread.start do
workbook = excel.Workboo... -
Fiber (59.0)
-
ノンプリエンプティブな軽量スレッド(以下ファイバーと呼ぶ)を提供します。 他の言語では coroutine あるいは semicoroutine と呼ばれることもあります。 Thread と違いユーザレベルスレッドとして実装されています。
...ます。
他の言語では coroutine あるいは semicoroutine と呼ばれることもあります。
Thread と違いユーザレベルスレッドとして実装されています。
Thread クラスが表すスレッドと違い、明示的に指定しない限り
ファイバーのコンテ......きます。
=== 例外
ファイバー実行中に例外が発生した場合、親ファイバーに例外が伝播します。
//emlist[例:][ruby]{
f = Fiber.new do
raise StandardError, "hoge"
end
begin
f.resume # ここでも StandardError が発生する。
rescue => e
p e.message #......と親にコンテキストを切り替えます。
Fiber.yield の引数が、親での Fiber#resume の返り値になります。
//emlist[例:][ruby]{
f = Fiber.new do
n = 0
loop do
Fiber.yield(n)
n += 1
end
end
5.times do
p f.resume
end
#=> 0
1
2
3
4
//}
以下... -
Monitor (31.0)
-
スレッドの同期機構としてのモニター機能を提供するクラスです。 また同じスレッドから何度も lock できる Mutex としての機能も提供します。
...かの別名を定義したクラスです。
=== 例
//emlist[消費者、生産者問題の例][ruby]{
require 'monitor'
buf = []
mon = Monitor.new
empty_cond = mon.new_cond
# consumer
Thread.start do
loop do
mon.synchronize do
empty_cond.wait_while { buf.empty? }
print buf.s......//emlist[デッドロックにならない例][ruby]{
require 'monitor'
mon = Monitor.new
mon.synchronize {
mon.synchronize {
}
}
//}
Thread::Mutex ではデッドロックになります。
//emlist[Mutex でデッドロックになる例][ruby]{
mx = Mutex.new
mx.synchronize {
mx.synchron... -
Enumerator (13.0)
-
each 以外のメソッドにも Enumerable の機能を提供するためのラッパークラスです。 また、外部イテレータとしても使えます。
...ます。
例えば以下のようなスレッドをまたいだ呼び出しはエラーになります。
//emlist[例][ruby]{
a = nil
Thread.new do
a = [1, 2, 3].each
a.next
end.join
p a.next
#=> t.rb:7:in `next': fiber called across threads (FiberError)
# from t.rb:7:in `<main>'
//}...