我的 Ruby 应用程序处理每个需要大约 10 秒才能执行的作业。每个作业都会花费大量时间等待 IO。我有使用简单 Time.now 比较的计时器来记录工作的每个阶段需要多长时间:
def timer
t = Time.now
yield
(Time.now - t).seconds
end
timer do
# IO
end
=> 1.342
最初,我按顺序处理所有作业,这很好,只是机器有 50% 的时间处于空闲状态(由于 IO)。
我转向多线程模型以收回一些 IO 时间。现在我为每个作业生成一个新线程,最多同时有 10 个线程。这很好用,除了当线程在运行计时器块时被抢占时,计时器在线程休眠时继续“运行”,导致计时器返回人为夸大的数字。
我需要的是一种计算计时器块的实际运行时间的方法,忽略睡眠时间。有没有办法实现这一点,比如询问 Thread.current 运行了多少时间?