English 中文(简体)
为什么Machine的推迟比Rub Thread缓慢?
原标题:Why is EventMachine s defer slower than a Ruby Thread?

我有两条文字,利用机械化,打上谷歌指数页。 我假定,Machine会比Ruby望快,但不是。

活动Machine代码费用:0.24suser 0.08s system 2% cpu 12.682 Total"

法文版编码费用:0.22suser 0.08s system 5% cpu 5.167 Total "

我以错误的方式使用事件吗?

活动:

require  rubygems 
require  mechanize 
require  eventmachine 

trap("INT") {EM.stop}

EM.run do 
  num = 0
  operation = proc {
    agent = Mechanize.new
    sleep 1
    agent.get("http://google.com").body.to_s.size
  }
  callback = proc { |result|
    sleep 1
    puts result
    num+=1
    EM.stop if num == 9
  }

  10.times do 
    EventMachine.defer operation, callback
  end
end

页: 1

require  rubygems 
require  mechanize 


threads = []
10.times do 
  threads << Thread.new do 
    agent = Mechanize.new
    sleep 1
    puts agent.get("http://google.com").body.to_s.size
    sleep 1
  end
end


threads.each do |aThread| 
  aThread.join
end
最佳回答

页: 1 活动Machine通过编造同步的IO,要求立即返回,并在完成后通知“反应堆”(由EM.run启动的活动场所)。 你有两条阻挡电话,打败了该系统的宗旨、睡觉和机械化。 你们必须利用特殊的同步/非锁定的图书馆来从活动Machine获得任何价值。

问题回答

这一线下的所有答案都缺少一个关键点:你们的呼声正在反应堆线内进行,而不是放在另一个推迟的线上。 在<条码>ffer中申请运行 呼吁是避免堵塞的正确途径,但你必须小心,你的追捕不会阻碍 lo。

当你操作<条码>EM.defer 操作时,电话<>/代码>,操作在Rub-spawed thread内进行,然后在主机内发放。 因此,sleep 1 in operation 平行运行,但封顶运行 />。 这解释了运行时间近9秒的差异。

在此,你正在使用一套简化的法典。

EM.run {
  times = 0

  work = proc { sleep 1 }

  callback = proc {
    sleep 1
    EM.stop if (times += 1) >= 10
  }

  10.times { EM.defer work, callback }
}

这大约需要12秒钟,即平行睡觉为1秒,serial睡觉为10秒,间接费用为1秒。

为了同时操作背书代码,你必须利用使用<条码>>EM.defer<>代码/代码”的代号来为它铺设新的条read。 同样:

EM.run {
  times = 0

  work = proc { sleep 1 }

  callback = proc {
    sleep 1
    EM.stop if (times += 1) >= 10
  }

  proxy_callback = proc { EM.defer callback }

  10.times { EM.defer work, proxy_callback }
}

然而,如果您的回馈本应在活动场所内执行守则,则你可能会遇到这一问题,因为守则在单独的、推迟的路面上运行。 如果发生这种情况,将问题代码移至代理人的召回中。

EM.run {
  times = 0

  work = proc { sleep 1 }

  callback = proc {
    sleep 1
    EM.stop_event_loop if (times += 1) >= 5
  }

  proxy_callback = proc { EM.defer callback, proc { "do_eventmachine_stuff" } }

  10.times { EM.defer work, proxy_callback }
}

该版本有大约3秒钟,其中1秒钟为平行运行睡觉,1秒钟为parallel <>>>和1秒。

http://github.com

活动Machine “defer”实际上是间谍 Ruby从一个校友那里接手处理你的请求。 是的,活动Machine设计用于不设锁的IO行动,但推迟指挥是例外——其目的是允许你在不阻挡反应堆的情况下进行长期运行。

因此,它会变得稍微慢,而光线透镜会减少,因为实际上,它只是用Machine的校友管理机铺开read。

http://eventnchne.rubyforge.org/EventMachine.html#M000486“rel=“nofollow” http://eventnchne.rubyforge.org/EventMachine.html#M000486

尽管如此,唱名页是大量使用事件Machine,但正如其他海报所说的那样,你需要使用一个没有锁定的IO图书馆,然后使用下一个标准或类似于开始你的任务,而后又推迟,因为后者把你的任务从反应堆库中分离出来。





相关问题
Ruby parser in Java

The project I m doing is written in Java and parsers source code files. (Java src up to now). Now I d like to enable parsing Ruby code as well. Therefore I am looking for a parser in Java that parses ...

rails collection_select vs. select

collection_select and select Rails helpers: Which one should I use? I can t see a difference in both ways. Both helpers take a collection and generates options tags inside a select tag. Is there a ...

RubyCAS-Client question: Rails

I ve installed RubyCAS-Client version 2.1.0 as a plugin within a rails app. It s working, but I d like to remove the ?ticket= in the url. Is this possible?

Ordering a hash to xml: Rails

I m building an xml document from a hash. The xml attributes need to be in order. How can this be accomplished? hash.to_xml

multiple ruby extension modules under one directory

Can sources for discrete ruby extension modules live in the same directory, controlled by the same extconf.rb script? Background: I ve a project with two extension modules, foo.so and bar.so which ...

Text Editor for Ruby-on-Rails

guys which text editor is good for Rubyonrails? i m using Windows and i was using E-Texteditor but its not free n its expired now can anyone plese tell me any free texteditor? n which one is best an ...