gpt4 book ai didi

ruby - 为什么 EventMachine 的延迟比 Ruby 线程慢?

转载 作者:数据小太阳 更新时间:2023-10-29 06:44:52 25 4
gpt4 key购买 nike

我有两个使用 Mechanize 获取 Google 索引页的脚本。我原以为 EventMachine 会比 Ruby 线程更快,但事实并非如此。

EventMachine 代码成本:“0.24s 用户 0.08s 系统 2% cpu 12.682 总计”

Ruby 线程代码成本:“0.22s 用户 0.08s 系统 5% cpu 5.167 总计”

我是否以错误的方式使用了 EventMachine?

事件机器:

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

ruby 线程:

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

最佳答案

该线程中的所有答案都缺少一个关键点:您的回调在 react 器线程内运行,而不是在单独的延迟线程中运行。在 defer 调用中运行 Mechanize 请求是避免阻塞循环的正确方法,但您必须注意您的回调不会同时阻塞循环。

当您运行 EM.defer operation, callback 时,该操作在 Ruby 生成的线程内运行,该线程完成工作,然后在主循环内发出回调。因此,operation 中的sleep 1 是并行运行的,但回调是串行 运行的。这解释了运行时间接近 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 秒,其中并行 sleep 为 1 秒,串行 sleep 为 10 秒,开销为 1 秒。

要并行运行回调代码,您必须使用使用 EM.defer 的代理回调为其生成新线程,如下所示:

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 }
}

但是,如果您的回调随后应该在事件循环中执行代码,那么您可能会遇到问题,因为它是在一个单独的延迟线程中运行的。如果发生这种情况,请将问题代码移至 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 秒用于并行回调休眠,1 秒用于开销。

关于ruby - 为什么 EventMachine 的延迟比 Ruby 线程慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3066342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com