2016-11-22 4 views
0

У меня есть 2 вопроса, которые относятся к модели с резьбой Vertx. The documentation упоминает:Vertx резьбовая модель

  • Vert.x экземпляр поддерживает тему цикла событий N (где N по умолчанию является основным * 2) по умолчанию.
  • Для уровней параллелизма требуется во многих современных приложениях, блокирующее подход просто не масштабируется

VertX также предоставляет функцию пула связанных потоков для обработки задач с использованием ресурсов сервера, требующие длительные периоды для обработки событий (рабочий потоки).

Итак, мы знаем, что потоки имеют накладные расходы с точки зрения требуемой памяти (например, для их стека) и при переключении контекста.

Потоки Vertx не блокируются (если они используются правильно), но если мы получили больше циклов событий, чем ядра (и пул потоков для рабочих потоков также), это не является неизбежным переключением контекста?

Второй вопрос. Я хочу понять, как vert гарантирует, что один цикл работает для цикла событий, учитывая тот факт, что переключение/планирование потоков выполняется на уровне ОС. Я красный в this documentation, что:

Контекст цикл событий выполняет обработчики на цикл событий: обработчики выполняются непосредственно на резьбу ввода-вывода, как следствие:

  • обработчик будет всегда выполняться с одной и той же нити
  • обработчик никогда не должен блокировать поток, иначе он создаст голод для всех задач ввода-вывода, связанных с этим циклом событий.

Может ли кто-нибудь уточнить «handlers are executed directly on the IO threads»?

ответ

2

К вашему первому вопросу, переключатели контекста неизбежны. Цель состоит в том, чтобы свести их к минимуму, а не избавиться от них. Номера по умолчанию цикла событий и работника хорошо ... по умолчанию. Обратите внимание, что наличие 8 циклов событий не означает, что все они будут использоваться. Если вы развернете один экземпляр стандартной Verticle, будет занят только один.

К вашему второму вопросу это означает, что потоки цикла обработки обрабатывают события IO Netty (сокета) (скрытые от разработчика по Vert.x), а также события Vert.x (соединение, запрос). На практике, когда принимается буфер HTTP-запроса, событие проходит через Netty и Vert.x до вашего кода приложения. Если вы заблокируете поток, невозможно обработать следующие события.

Смежные вопросы