JavaScript中的非阻塞setTimeout与Ruby中的sleep比较

5

因为 JavaScript 是事件驱动的,所以 setTimeout 看起来不会阻塞。这意味着如果我这样做:

setTimeout(function(){
  console.log('sleeping');
}, 10);
console.log('prints first!!');

它将输出'prints first!!'然后是'sleeping'

JavaScript解释器不会等待setTimeout完成,相反,它立即执行其下面的代码。当10ms过去时,它才执行回调函数。

最近我一直在玩ruby。我知道它在event-machine库中具有非阻塞支持。但我想知道是否可以使用sleep或任何ruby本地函数在闭包proc、块或其他方式中实现类似于我刚刚用javascript写的setTimeout示例?这种情况是否可能?谢谢。

2个回答

5
< p > setTimeout函数与sleep完全不同,因为前者是异步的,而后者是同步的。

Ruby的sleep方法与其POSIX对应方法一样,会暂停脚本执行。JavaScript的setTimer函数会在将来的某个时刻触发回调。

如果你想触发异步回调,你可能需要像EventMachine这样的东西来为你运行事件循环。


3

你可以使用线程来实现一些非常基本的异步行为:

timeout = Thread.new(Time.now + 3) do |end_time|
  while Time.now < end_time
    Thread.pass
  end
  puts "Ding!"
end

main = Thread.new do
  puts "Main"
end

main.join
timeout.join

我不知道你是否想要使用线程编程。对我来说,这似乎过于繁琐,但如果你不能使用EventMachine,这是一个选项。


是的,看起来线程不是我要使用的东西。我知道异步需要使用事件机制,但我只是好奇。谢谢。 - Benny Tjia
线程触发异步回调的一个大问题是试图强制在调用线程上执行回调块。这很棘手,除非你有一个适当的事件循环,在那里有明确定义的执行位置。 - tadman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接