25

一段时间后调用的函数如何用 javascript 或任何其他解释语言实现?

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

谢谢

4

1 回答 1

0

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

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

  2. 与上面类似,但是您使用pthread_cond_timedwait(2) 并且线程在超时发生时唤醒,或者当条件变量触发以安排新的回调时。

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

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

  5. 像上面一样,但不使用 timeout 参数,您可以使用timerfd_create(2) ,它是一个文件描述符,用于传递时间到期。

于 2021-03-28T12:03:27.387 回答