【Ruby】マルチスレッドではなくマルチプロセスで実現する方法

このQ&Aのポイント
  • 以下のプログラムをマルチスレッドではなくマルチプロセスで実現する方法を教えてください。
  • 現在のプログラムでは、ネットに繋いで処理する部分がパラレルに行われていないため、マルチプロセス化することで処理速度を向上させたいと考えています。
  • ただし、Rubyのバージョンを上げることは避けたいです。
回答を見る
  • ベストアンサー

【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】してる所は、ネットに繋いで云々の時間のかかる処理なのですが、まったくパラレルに行なっている様子が無いので、マルチプロセス化したら早くなるかなと思いました。 子プロセスを生成して親プロセスとはパイプで繋いで、、などとするのかなあと試行錯誤したのですが、どうもうまくできません。 ご指導の程、よろしくお願い申し上げます。

  • Ruby
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

> まったくパラレルに行なっている様子が無い スタートしたスレッドに対して、逐次joinしているからかと。 スレッドの生成と待ち合わせについて見直してみては。 検索すると、すでにいろんな人がその手の記事を書いてるみたいですし。

kingfruits
質問者

お礼

osamuyさん ご回答有り難うございました。

関連するQ&A

  • Ruby

    ## -*- Mode: ruby -*- ###################################################################### =begin = nth機能付き連結リストクラステスト用プログラム =end ###################################################################### require 'MyLinkedList.rb' ; n = 10 ; ##------------------------------ ## 最初のリストを作成。 # 新しくリストのインスタンスを生成 list0 = MyLinkedList::new() ; # 0からnまで順に i に入れて、繰り返す。 (1...n).each{|i| # i の自乗を先頭に挿入 list0.insertToFirst(i * i) ; } ##------------------------------ ## insertToNthのテスト puts("-" * 60) ; puts("insertToNthのテスト") ; puts("before:" + "list0=" + list0.to_s()) ; puts("insert 'foo' into 5th.") ; list0.insertToNth(5,'foo') ; puts("after :" + "list0=" + list0.to_s()) ; puts("insert 'bar' into 0th.") ; list0.insertToNth(0,'bar') ; puts("after :" + "list0=" + list0.to_s()) ; puts("insert 'baz' into 10th.") ; list0.insertToNth(10,'baz') ; puts("after :" + "list0=" + list0.to_s()) ; ##------------------------------ ## deleteFromNthのテスト puts("-" * 60) ; puts("deleteFromNthのテスト") ; puts("before:" + "list0=" + list0.to_s()) ; puts("delete 5th.") ; deletedItem = list0.deleteFromNth(5) ; puts("after :" + "list0=" + list0.to_s()) ; puts("deleted Item=" + deletedItem.to_s()) ; puts("delete 0th.") ; deletedItem = list0.deleteFromNth(0) ; puts("after :" + "list0=" + list0.to_s()) ; puts("deleted Item=" + deletedItem.to_s()) ; puts("delete 10th.") ; deletedItem = list0.deleteFromNth(10) ; puts("after :" + "list0=" + list0.to_s()) ; puts("deleted Item=" + deletedItem.to_s()) ; の意味がわかる方、教えてください

  • ruby テキストファイル書き出しでの文字化け

    ruby&mac&文字の扱い 初心者です。 mac os 10.6.8 HTMLの情報を読み込みテキストファイルに書き出したいのですが、 ターミナル上、putsではきちんと日本語で表示されるのですが、書き出したあとの txtファイルを開くと文字化けしています。 File.open("test.txt","w") do |file| @s_info.each do |data| puts data[:m_sec] file.puts data[:m_sec] end end よろしくお願いします。

    • ベストアンサー
    • Ruby
  • Ruby の 文法に困ってます。

    以下のようなソースの場合、to_sメソッドは何時呼ばれているのでしょうか。またどういう意味を成しているのでしょうか。 Ruby初心者のためご教授頂けないでしょうか。 よろしくお願いします。 class Vector   attr_accessor :x, :y   def initialize(x=0, y=0)     @x = x     @y = y   end   def length     Math::sqrt(@x ** 2 + @y ** 2)   end   def to_s      "(#{@x},#{@y})"   end   def <=> other     length <=> other.length   end end arr =[] arr << Vector.new(2,2) arr << Vector.new(3,2) arr << Vector.new arr.sort.each do |item|   puts item end 結果は以下になります。 (0,0) (2,2) (3,2)

    • ベストアンサー
    • Ruby
  • Rubyの構文?言語仕様?

    Rubyの以下コードについて質問です。 #!/ruby/bin/ruby print "content-type: text/html\r\n\r\n"; puts "Hello World!" begin def foo x =0 (0...10).each do |value| print value.to_s +"の時"+ x.to_s + "<br />" end end foo rescue =>e print e.class.to_s+ "<br />" print e.message end 上記コードを実行すると以下のような例外を取得します NoMethodError undefined method `+@' for "\343\201\256\346\231\202":String どうやら上記コードの print value.to_s +"の時" の部分の  +"の時" という箇所が問題のようなのですが 上記箇所を + "の時" のように 文字列連結子の +と "の間に半角スペースを 入れるとうまく実行されます。 いったい原因はなんなのでしょうか? 細かい箇所ですが是非、ご教授ください。

    • ベストアンサー
    • Ruby
  • Rubyの株価ダウンロードプログラム

    以下は、Yhooファイナンスからの株価ダウンロードプログラムらしいのですが、私にはどういったことをしているのか、いまいちわかりません。 どなたか解説していただけませんか。 require 'open-uri' require 'nkf' require 'jcode' require 'date' $KCODE='s' # 漢字コードをEUCに。Windowsでは 's' #****シフトJISに変換**** class String def to_sjis henkan = NKF.nkf('-s', self) henkan end end #*************** today = Date::today regEx = '(\d+)年(\d+)月(\d+)日<\/small><\/td><td><small>([\d,]+)<\/small><\/td><td><small>([\d,]+)<\/small><\/td><td><small>([\d,]+)<\/small><\/td><td><small><b>([\d,]+)<\/b><\/small><\/td><td><small>([\d,]+)<\/small><\/td><td><small>([\d,]+)' 1301.upto(9999) do |meigara| begin begin meigaradatafile = open("#{meigara}.csv" , "r" ) rescue puts "#{meigara}" + 'は存在しません' meigaradatafile = open("#{meigara}.csv" , "w" ) meigaradatafile.close meigaradatafile = open("#{meigara}.csv" , "r" ) end meigaradata = meigaradatafile.readlines if meigaradata == [] lastdate = Date::new(1983 , 1 , 4) else meigaradatalastline = meigaradata[meigaradata.length-1].split(/\s*,\s*/) lastyear = meigaradatalastline[0] lastmonth = meigaradatalastline[1] lastday = meigaradatalastline[2] meigaradatafile.close lastdate = Date::new(lastyear.to_i , lastmonth.to_i , lastday.to_i) if lastdate >= today next end lastdate = lastdate + 1 end starttime = Time.now temp2 = String.new max = today - lastdate 0.step(max , 50) do |i| begin f = open("http://table.yahoo.co.jp/t?s=#{meigara}.t&a=#{lastdate.month 5;&b=#{lastdate.day}&c=#{lastdate.year}&d=# 23;today.month 5;&e=#{today.day 25;&f=#{;today.year}&g=d&q=t&y=#{i}&z=#{meigara}.t&x=.csv") rescue TimeoutError puts 'タイムアウト リトライ' retry end str = Array.new temp = String.new temp = f.read.to_sjis temp3 = Array.new temp.each_line do |line| line = line.gsub("," , "") if line.scan(/#{regEx}/) != [] str.push line.scan(/#{regEx}/) end end p meigara.to_s + ':' + i.to_s if str == [] break end str.each do |j| temp3.push j end temp3.each do |k| temp2 = k.join(",").to_s + "\n" + temp2 end end if temp2 != "" foo = open("#{meigara}.csv",'a') foo.puts temp2 foo.close end elapsedtime = (Time.now - starttime)/60 yosou = elapsedtime * (9999 - meigara.to_i) puts meigara.to_s + ' ' + '経過時間' + ':' + (elapsedtime.to_s) + '予想時間' + ':' + (yosou/60/60).to_s rescue retry end end

  • Rubyについて質問です

    Rubyについて質問です class Document #省略 def each_word word_array = words index = 0 while index < words.size yield(word_array[index]) index += 1 end end end d = Document.new('Truth', 'Gump', 'Life is like a box of...') d.each_word { |word| puts word } このような例題があるのですが、 このまま実行しても引数エラーがでてしまいます。 「省略」のところをどのように追加すれば実行できるようになりますか? 参考書:ELOQUENT RUBYの中の例題です ちなみに実行結果は以下の通りです Life is like a box of ... どうかよろしくお願いいたします

  • 【ruby】無名関数?でブロック付きメソッドって作れませんか?

    Proc.new do|arg|  arg.each do |x|   puts x  end end.call([1,2,3,4,5]) 上記のようなものを無名関数と理解しているのですが、 これを下記の様にすると、 Proc.new {|arg|  arg.each do |x|   yield(x)  end }.call([1,2,3,4,5]) do |x|  puts x end no block given とエラーになってしまいます。 無名関数で、ブロック付きメソッドって作れないものでしょうか? ご指導の程、宜しくお願いいたします。

    • ベストアンサー
    • Ruby
  • XREA MySQL CGI Ruby エラー

    XREAの無料サーバーに設定されたMySQLのデータベースをCGIとして設定したRubyからアクセスしたいのですが、require 文を入れると Internal Server Error が出ます。(コメントアウトすると動きます) よろしくお願いします。 #!/usr/local/bin/ruby require 'mysql' #↑ここが問題と思われます puts 'Content-Type: text/html' puts '' puts '<!doctype html>' puts '<html>' puts '<head>' puts '<meta charset="utf-8">' puts '<title>TEST</title>' puts '</head>' puts '<body>' puts 'Hello World' #↓requireでエラーになるのでコメント中 #my = Mysql.new('127.0.0.1', 'id', 'password', 'dbname') #res = my.query('SELECT * from T_test') #res.each do |row| # puts row[0] #end puts '</body>' puts '</html>'

    • ベストアンサー
    • CGI
  • ruby forkについて教えて下さい

    親プロで用意した配列の中の要素を一つづつ子プロでputsした後、最後一回、親プロで生成した子プロのPIDを確認したいです。 こんなふうに書いてみました。 #!/usr/bin/ruby table=%w(a b c d) array=[] while i=table.pop do if pid=fork then array.push pid puts pid break if table.size > 0 p array else puts i end end 実行すると、以下のような結果になりました。 $9200 c 9201 b 9202 [9202] a $ PIDが一つしか得られてません。 どうしたらよいでしょうか? ご教授の程、宜しくお願いいたします。 rubyは 1.8.7 を使ってます。 以上、宜しくお願いいたします。

    • ベストアンサー
    • Ruby
  • rubyのactive_recordについて

    # coding:utf-8 require 'active_record' ActiveRecord::Base.configurations = YAML.load_file('database.yml') ActiveRecord::Base.establish_connection('development') class Bookinfo < ActiveRecord::Base end bookinfo = Bookinfo.order("updated_at DESC").first bookinfo.each do |info| puts info.id puts info.author puts info.title puts info.page puts info.date_available end rubyでSQLite3のデータベースにアクセスしてデータの一番新しいものを1つ取り出すプログラムを作成しようと思います。(データベース名: bookinfo.db テーブル名:bookinfo)  このように書いてみましたが、またいろいろ試して見たのですが、どうしてもうまくい きません。教えてくださいお願いします。

    • ベストアンサー
    • Ruby

専門家に質問してみよう