Как vert.x является однопоточным?

Насколько я понимаю, каждому экземпляру vert.x будет назначен цикл событий. Цикл событий обрабатывает все запросы другой задачи для этого конкретного экземпляра. Я думаю, цикл событий - это поток. Когда развернуто несколько экземпляров vert.x, у каждого экземпляра есть свои циклы событий, верно? Это означает, что существует несколько потоков (многопоточность). Вот как я понял. Эта однопоточная концепция вызывает у меня столько головной боли. Любая помощь будет оценена.


person Ronald Randon    schedule 29.05.2014    source источник
comment
Более одного цикла событий означает отсутствие многопоточности?   -  person Ronald Randon    schedule 29.05.2014
comment
Когда вы говорите об экземпляре vert.x, вы имеете в виду экземпляр verticle?   -  person David Dossot    schedule 03.06.2014


Ответы (2)


Vert.x не является однопоточным, как node.js. В vert.x вы должны различать Verticles и WorkerVerticles. Один экземпляр Vert.x создаст несколько циклов обработки событий (которые являются потоками), обычно по одному на ядро ​​ЦП. Вертикали будут назначены циклу событий и всегда будут выполняться одним и тем же потоком, но только если есть работа. WorkerVerticles будет назначен потоку из рабочего пула и может выполняться разными потоками. Что делает программирование с помощью Vert.x увлекательным, так это тот факт, что вы можете «притвориться», что он однопоточный. Вам не нужно заботиться о параллелизме, потому что вы не можете совместно использовать переменные между вершинами. Каждая вершина работает в своем собственном загрузчике классов, и вы можете обмениваться данными только через шину событий. (Также есть общая карта, но в данном случае это отвлекает.)

person Mr__Steel    schedule 11.11.2014
comment
Вертикали будут назначены циклу событий и всегда будут выполняться одним и тем же потоком, но только если есть работа. Это звучит очень плохо. Это означает, что у вас могут быть две занятые вертикали в одном потоке, блокирующие друг друга, в то время как другие потоки простаивают. Golang делает это правильно — готовые горутины всегда назначаются следующему доступному потоку. - person aaa90210; 19.04.2016
comment
Я предполагаю, что для простого REST-сервера вы не хотите выполнять вызовы базы данных с рабочей вершиной, а затем отправлять данные через eventBus, потому что это слишком дорого. Я предполагаю, что лучше всего использовать io.vertx.ext.web.Router для обработки запросов в основной вертикали. Но я не знаю, всегда ли код MainVerticle выполняет один и тот же поток — я предполагаю, что это так. - person Alexander Mills; 28.01.2019
comment
@aaa90210 см. Не звоните нам, мы позвоним вам. - person O.Badr; 17.06.2021

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

Экземпляр vert.x создаст несколько потоков. Внутри этого экземпляра vert.x у вас запущено несколько вертикул (точнее, экземпляров вертикул). Это экземпляр вершины, которому назначен цикл событий, но этот цикл событий не назначен исключительно этой вершине.

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

Но, как только экземпляр вершины запущен и назначен циклу/потоку событий, он будет работать на нем до тех пор, пока вершина не будет завершена.

person Andrei Stanescu    schedule 12.09.2014