Ruby(CRuby)におけるマルチスレッド処理が可能?

今、マルチコアCPUが普及しています。
その恩恵を受け、処理を分割して複数のプロセッサーで同時に実行させたいのですが、
Rubyは、こういうような複数のスレッドの同時実行をサポートしているのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (1件)

Ruby1.9はOSのスレッド機能で複数スレッドを実行しますので、1プロセス複数スレッドをマルチコアで同時実行をサポートしたOSなら同時実行が出来ます。


Ruby1.8はOS上では1スレッドで動くので、Rubyプログラム上で複数スレッドを実行しても複数コアで同時実行はされません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q【Ruby】マルチスレッドでなくマルチプロセスで

以下の様なプログラムをマルチスレッドでなくマルチプロセスで実現したいです。

#!/usr/bin/ruby
require 'thread'

q=Queue.new
data=%w(a * * * b * * c * * d * *)

data.each do |d|
q.push d
end

(1..4).each do |n|
Thread.start {
while 1 do
d=q.shift
break if d!='*'
end
puts n.to_s+' '+d.to_s
}.join
end

rubyのバーションは
ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin10.0]
です。バージョンをあげる事は、できれば避けたいです。

実際には上記プログラムの【puts n.to_s+' '+d.to_s】してる所は、ネットに繋いで云々の時間のかかる処理なのですが、まったくパラレルに行なっている様子が無いので、マルチプロセス化したら早くなるかなと思いました。
子プロセスを生成して親プロセスとはパイプで繋いで、、などとするのかなあと試行錯誤したのですが、どうもうまくできません。

ご指導の程、よろしくお願い申し上げます。

以下の様なプログラムをマルチスレッドでなくマルチプロセスで実現したいです。

#!/usr/bin/ruby
require 'thread'

q=Queue.new
data=%w(a * * * b * * c * * d * *)

data.each do |d|
q.push d
end

(1..4).each do |n|
Thread.start {
while 1 do
d=q.shift
break if d!='*'
end
puts n.to_s+' '+d.to_s
}.join
end

rubyのバーションは
ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin10.0]
です。バージョンをあげる事は、できれば避けたいです。

実際には上記...続きを読む

Aベストアンサー

> まったくパラレルに行なっている様子が無い

スタートしたスレッドに対して、逐次joinしているからかと。
スレッドの生成と待ち合わせについて見直してみては。

検索すると、すでにいろんな人がその手の記事を書いてるみたいですし。

Qrubyプログラムからrubyプログラムを複数起動するには?

どなたかご存知の方。教えてください。
rubyの中で別のrubyのプログラムを起動したいのですが、
どのように記述したら良いでしょうか?
この際の親プログラムは子プログラムを起動する事だけが目的なので、
子プログラムの実行結果の取得はせずに、子プログラム起動後即終了するようにしたいです。

初心者なものでどのようにしたら良いかわからず、困っています。
よろしくお願いします。

Aベストアンサー

#4です。
fork & execが定番のやり方になります。
以下のようなスクリプトを作ってください。
ファイル名:test_fork.rb
--------------------------------
def start_proc(ruby_script)
pid = fork do
exec("/usr/bin/ruby" + " " + ruby_script)
end
end
print "main start\n"
start_proc("test1.rb")
start_proc("test2.rb")
print "main end\n"
-----------------------------------
start_procはruby_scriptを引数として、そのスクリプトをバックグラウンドで起動します。
(そのスクリプトの終了を待ちません)
テスト用に以下の2つのスクリプトを起動しますので、以下のスクリプトも作成してください。

ファイル名:test1.rb
------------------------------
print "test1.rb start\n"
sleep(10)
print "test1.rb end\n"
-------------------------------

ファイル名:test2.rb
-----------------------------
print "test2.rb start\n"
sleep(5)
print "test2.rb end\n"
-------------------------------

ruby test_fork.rb を実行します。
実行結果は以下のようになります。
-------------------------------------
main start
main end
test1.rb start
test2.rb start
test2.rb end
test1.rb end
-------------------------
test_fork.rbはテスト用スクリプトを起動後、直ちに停止しています。
尚、今回、start_proc("test1.rb")はフルパスでパス名を指定していません。(手抜きです。)
実際に運用される場合は、start_proc("/aaa/bbb/test1.rb")のようにフルパスで指定してください。

当方の環境は以下の通りです。
centos 6.5
ruby 1.9.3p551

#4です。
fork & execが定番のやり方になります。
以下のようなスクリプトを作ってください。
ファイル名:test_fork.rb
--------------------------------
def start_proc(ruby_script)
pid = fork do
exec("/usr/bin/ruby" + " " + ruby_script)
end
end
print "main start\n"
start_proc("test1.rb")
start_proc("test2.rb")
print "main end\n"
-----------------------------------
start_procはruby_scriptを引数として、そのスクリプトをバックグラウンドで起動します。
(そのスクリプトの終了を...続きを読む

QRuby と Ruby on Rails

Ruby と Ruby on Railsは何が違うんでしょうか?

漠然とした質問ですいません。

Aベストアンサー

「日本語」と「書類作成テンプレート」みたいな物です。
日本語が出来ても、それだけで仕事が出来るわけではありませんよね。
どんなに優れた言語があっても、それで優れたシステムが作れるわけではありません。
むしろ、優れた開発支援システム(=フレームワーク)を使うために、そこで使われる言語を選ぶ場合があります。

QRubyで画像処理

Rubyで画像処理はどこまでできますか。
画像のなかのある特定の色を使っている四角形やら曲線やらの角の座標や外側の線の座標などを取得したいなと思うのですがそういうことはできますか?

Aベストアンサー

画像処理、特に質問者の言うような「パターン認識」などの処理に関しては、これはRubyというよりも、C言語などで書かれたライブラリということになると思います。

このようなライブラリでデフォルトなのはOpenCVです。
http://opencv.jp/

RubyからOpenCVを扱えるようにするライブラリもあるみたいです。
http://blueruby.mydns.jp/opencv/

QRuby の実行について

Ruby初心者です。 メモ帳で puts "hello world"と打ち、名前をsample.rbにし、c:\Users\rbというファイルに保存しました。次にコマンドプロンプトで c:\Users\rb>ruby sample.rb と入力したんですが、'ruby'は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。といわれました。 どうすればいいのですか? 本を見てもネット上のサイトをみても >ruby ●●.rb なんです。

Aベストアンサー

システムにRubyがインストールされていないか、またはインストールされているとしてもrubyにパスが通っていないのが原因です。

「パスの通し方」「windows path」などで検索すると、参考URLに挙げたような資料が沢山見つかるはずです。それを参考にruby.exeにパスを通してください。

なお、Rubyをインストーラーでインストールした場合、パスが通った状態のコマンドプロンプトを起動するための項目がメニューに登録されていることもあります。それがありそうならばそれを利用する手もあります。

参考URL:http://pocketstudio.jp/win/xp/path.html


人気Q&Aランキング

おすすめ情報