0

我写了这段关于ruby线程的代码来打开50个线程,每个线程等待2s。

#!/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 秒就结束了。我不知道如何编写代码让它在每个事件机器循环中等待几秒钟。

有人可以帮忙吗?谢谢!

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 线程。它们保存在线程池中,因此您可以在线程执行时节省一些启动/停止线程的开销。当您要求超过 20 项工作时,EM 还会处理将工作传递给线程。

如果您想比较它们,只需创建一个与您的工作负载建模相同的 EM 程序和一个线程程序。然后计算他们需要多长时间才能完成。

于 2013-10-11T13:27:22.310 回答