Ответ 1
Модель Proactor предполагает разделение процесса сетевого сеанса на такие подзадачи, как: разрешение имени хоста, прием или соединение, чтение или запись некоторой части информации, закрытие соединения - и позволяет переключаться между подзадачами с разных сеансов. В то время как модель Reactor рассматривает процесс сетевого сеанса как (почти) одиночную задачу.
Абсолютные преимущества Proactor:
- Производительность повышается из-за задачи "аутсорсинг". Например, вы можете отправить запрос разрешения на DNS и подождать 5 минут, чтобы ответ ничего не делал (Reactor) - или вы можете делать другие вещи во время ожидания (Proactor).
Абсолютные недостатки Проактора:
- Производительность уменьшается из-за переключения задачи, а это означает, что за один сеанс вы выполняете больше кода (Proactor), чем он должен быть (Reactor).
Но общая производительность обычно измеряется у нескольких "удовлетворенных" клиентов за период времени. Таким образом, преимущества Proactor против Reactor зависят от ситуации. Вот несколько примеров.
-
HTTP-сервер. Клиент хочет увидеть что-то в своем окне браузера. Ему не нужно ждать, пока вся страница загрузится, чтобы увидеть первые фрагменты текста. Proactor эффективен, поскольку частичная загрузка страницы быстрее, чем загрузка всей страницы. Однако вся страница загружается примерно в то же время, что и в модели Reactor.
-
Игровой сервер с низкой задержкой. Клиент хочет получить полный результат своей команды как можно быстрее. Реактор эффективен, поскольку нет подзадач, таких как частичное чтение или запись - клиент ничего не увидит, пока не прочитает полный ответ. Таким образом, Reactor не будет выполнять дополнительных переключений между подзадачами, и в каждый момент он гарантирует, что какой-то клиент получит прогресс в своей команде, в то время как Proactor заставит всех клиентов ждать друг друга непредсказуемым временем.
Многопоточность может дать вам линейное ускорение в обоих случаях.