如何在javascript解释器或定时器中实现setTimeout?

时间:2009-04-11 10:41:01

标签: implementation interpreted-language

在javascript或任何其他解释语言中实现了一段时间之后调用的函数是什么?

换句话说,javascript解释器中是否有一个循环,它一直检查定时器列表,或者操作系统是否有任何特定的方式来处理它?<​​/ p>

由于

3 个答案:

答案 0 :(得分:9)

John Resig's blog

中有一个很好的描述

答案 1 :(得分:1)

您可以查看FirefoxWebKit的来源,了解他们是如何实施的。

答案 2 :(得分:0)

您维护一个排序的数据结构(例如优先级队列),允许您存储(超时、回调)。这使您可以快速确定下一次超时的时间。关键在于我们如何等待,以及如何中断等待以安排新的回调。

  1. 您可以通过 sleep(3) 在线程中等待,完成后调用回调。当您需要安排新的(超时、回调)时,向线程发送 signal(2) 或 pthread_cond_signal(3)。

  2. 您可以安排 pthread_cond_timedwait(2) 并继续您正在执行的任何其他任务。当警报响起时,它会向您的进程发送一个信号,您可以在方便时调用回调。要安排新的超时时间,您可以设置一个新的闹钟,这将取消旧的闹钟。

  3. 您使用 alarm(2)/select(2)/poll(2) 超时。当超时发生时,您调用回调。要安排新的回调,您将一个字节写入管道,该字节专门用于让 select/poll/epoll 返回,以便您安排新事件。例如,chrome/node/v8 使用这种方法只是包装在兼容层中(参见 How is setTimeout implemented in node.js)。

  4. 与上面一样,但不使用超时参数,您可以使用 epoll_*(2),它是一个文件描述符,提供时间到期。