0

ruby スレッドに関するこのコードを書いて、50 のスレッドを開き、すべてのスレッドが 2 秒待機するようにしました。

#!/home/sun/.rvm/rubies/ruby-1.9.3-p448/bin/ruby
ts = []
50.times do |p|
    ts << Thread.new do
        sum = 0
        5.times do |i|
            sleep(2)
        end
        puts "turn "+p.to_s+" finished"
    end
end

ts.each {|x| x.join}

また、Ruby eventmachine と比較すると、EM.do で sleep を使用することはできません。eventmachine のリアクターがブロックされるためです。

だから私は以下のコードを書いてみました:

#!/home/sun/.rvm/rubies/ruby-1.9.3-p448/bin/ruby
require 'eventmachine'
ts = []
EM.run do
    q = 0
    def dfs(tm)
        return 0 if tm == 0
        EM.add_timer(2) do
            dfs(tm-1)
        end
    end
    50.times do |p|
        op = proc do
            dfs(5)
        end
        callback = proc do 
            puts "turn "+p.to_s+" finished"
            q += 1
            if q == 50 
                EM.stop
            end
        end
        EM.defer(op,callback)
    end
end

しかし、わずか 1 秒でオーバーしてしまいます。すべての eventmachine ループで数秒間待機させるようにコーディングする方法がわかりません。

誰でも助けてもらえますか?ありがとう!

4

2 に答える 2

0

Eventmachine はシングルスレッドです。それらを比較することはできません。実際の状況をテストしたい場合は、DB 'sleep' を試すことができます。例: mongo http://docs.mongodb.org/manual/reference/command/sleep/。ただし、リクエストにはEMライブラリを使用してください。例: https://github.com/bcg/em-mongo

于 2013-09-25T11:21:05.760 に答える
0

効率はワークロードに依存します。多くの IO 作業を行っている場合は、コンテキスト スイッチのコストが発生しないため、EM が勝つ可能性が高くなります。IO を実行するとき、アイドル状態で多くの時間が費やされます。

一方、計算負荷の高い作業を行っている場合は、やはり依存します。EM には 20 スレッドのスレッド プールがあります。20 を超える並列計算がある場合は、適切な数の Ruby スレッドを生成する方が適切です。

EM スレッドは単なる Ruby スレッドです。それらはスレッドプールに保持されるため、実行時にスレッドを開始/停止するオーバーヘッドを少し節約できます。EM は、20 を超える作業項目を要求した場合に、作業をスレッドに渡すことも処理します。

それらを比較したい場合は、ワークロードをモデル化する同じ EM プログラムとスレッド化されたプログラムを作成するだけです。次に、それらが完了するまでにかかる時間を計ります。

于 2013-10-11T13:27:22.310 に答える