Насколько я понимаю, каждому экземпляру vert.x будет назначен цикл событий. Цикл событий обрабатывает все запросы другой задачи для этого конкретного экземпляра. Я думаю, цикл событий - это поток. Когда развернуто несколько экземпляров vert.x, у каждого экземпляра есть свои циклы событий, верно? Это означает, что существует несколько потоков (многопоточность). Вот как я понял. Эта однопоточная концепция вызывает у меня столько головной боли. Любая помощь будет оценена.
Как vert.x является однопоточным?
Ответы (2)
Vert.x не является однопоточным, как node.js. В vert.x вы должны различать Verticles и WorkerVerticles. Один экземпляр Vert.x создаст несколько циклов обработки событий (которые являются потоками), обычно по одному на ядро ЦП. Вертикали будут назначены циклу событий и всегда будут выполняться одним и тем же потоком, но только если есть работа. WorkerVerticles будет назначен потоку из рабочего пула и может выполняться разными потоками. Что делает программирование с помощью Vert.x увлекательным, так это тот факт, что вы можете «притвориться», что он однопоточный. Вам не нужно заботиться о параллелизме, потому что вы не можете совместно использовать переменные между вершинами. Каждая вершина работает в своем собственном загрузчике классов, и вы можете обмениваться данными только через шину событий. (Также есть общая карта, но в данном случае это отвлекает.)
io.vertx.ext.web.Router
для обработки запросов в основной вертикали. Но я не знаю, всегда ли код MainVerticle выполняет один и тот же поток — я предполагаю, что это так.
- person Alexander Mills; 28.01.2019
Вы, вероятно, уже поняли это, но я публикую ответ для других людей, которые могут достичь этого вопроса.
Экземпляр vert.x создаст несколько потоков. Внутри этого экземпляра vert.x у вас запущено несколько вертикул (точнее, экземпляров вертикул). Это экземпляр вершины, которому назначен цикл событий, но этот цикл событий не назначен исключительно этой вершине.
Перекрытия могут возникать, когда вы запускаете больше вершин, чем количество потоков. В этом случае некоторые вершины будут назначены тому же циклу событий, что и другие вершины. Этот цикл обработки событий будет обрабатывать события из всех назначенных вершин.
Но, как только экземпляр вершины запущен и назначен циклу/потоку событий, он будет работать на нем до тех пор, пока вершина не будет завершена.