0

これが私のコードです。スリープを使用して、長時間実行されるリクエストをシミュレートします

require 'eventmachine'


def test (i)
    puts "#{i} start to sleep..."
    sleep i
    puts "#{i} end..."
end

EventMachine.run do
    (1..3).each do |i|
        test i
    end
    Signal.trap("INT") do
        connection.close do
            EM.stop { exit }
        end
    end
end

それは私に与えます:

1 start to sleep...
#### after 1 second
1 end...
2 start to sleep...
#### after 2 seconds
2 end...
3 start to sleep...
#### after 3 seconds
3 end...

私は得ると思います:

#### immediately
1 start to sleep...
2 start to sleep...
3 start to sleep...
#### after 1 second
1 end...
#### after 1 second
2 end...
#### after 1 second
3 end...

私のコードの何が問題なのですか?同時実行する方法は? または、どうすればできますか?

4

2 に答える 2

1

並行性とマルチスレッドを混同していると思います。イベント マシンはシングル スレッドです...同時実行をシミュレートする方法の例を見てください:
https://github.com/eventmachine/eventmachine/wiki/Code-Snippets

于 2013-02-04T08:36:19.540 に答える
0

EventMachine#mapメソッドを使用する可能性があります。

EM::Iterator.new(1..3).map(proc{ |num,iter|
  iter.return(test(num))
}, proc{ |results|
  p results
})

ここには環境がないため、コードをテストしませんでしたが、ヒントが得られるはずです。それが役に立てば幸い。

于 2013-02-04T09:11:41.077 に答える