Как setTimeout реализован внутри браузера? А что будет, если мы запустим 10 setTimeout одновременно? - PullRequest
0 голосов
/ 29 марта 2020

Как setTimeout реализован внутри браузера?

Я знаю, как работает setTimeout, и когда таймер завершается, браузер помещает свой обратный вызов в очередь обратного вызова. Мне больше интересно, как браузер это реализовал. Я пытался заглянуть в chrome исходный код. Я нашел следующую ссылку c ++ фрагмент кода:

int WindowOrWorkerGlobalScope::setTimeout(
    ScriptState* script_state,
    EventTarget& event_target,
    V8Function* handler,
    int timeout,
    const HeapVector<ScriptValue>& arguments) {
  ExecutionContext* execution_context = event_target.GetExecutionContext();
  if (!IsAllowed(execution_context, false, g_empty_string))
    return 0;
  if (timeout >= 0 && execution_context->IsDocument()) {
    // FIXME: Crude hack that attempts to pass idle time to V8. This should
    // be done using the scheduler instead.
    V8GCForContextDispose::Instance().NotifyIdle();
  }
  auto* action = MakeGarbageCollected<ScheduledAction>(
      script_state, execution_context, handler, arguments);
  return DOMTimer::Install(execution_context, action,
                           base::TimeDelta::FromMilliseconds(timeout), true);
}

https://github.com/chromium/chromium/blob/2ef3297d58ea66d2d8991bb7972a093d35527287/third_party/blink/renderer/core/frame/window_or_worker_global_scope.cc

Но не в состоянии понять здесь, что происходит. Я также понимаю, что это так называемые планировщики. Но какой алгоритм он использует в случае создания множественного setTimeout. Как это происходит в памяти.

...