В синхронной модели, когда клиент подключается к серверу, клиент и сервер должны синхронизировать друг с другом, чтобы завершить некоторые операции.
Между тем, асинхронная модель позволяет клиенту и серверу работать отдельно и независимо. Клиент отправляет запрос на установление соединения и что-то делает. Пока сервер обрабатывает запрос, клиент может сделать что-то еще. По завершении операции событие завершения помещается в очередь в демультиплексоре событий, ожидая, когда Proactor (например, обработчик HTTP) отправит запрос назад и вызовет обработчик завершения (на клиенте). Термины используются как в файле boost:: asio Шаблон проектирования Proactor: Concurrency Без потоков.
Таким образом, асинхронная модель может принимать одновременные соединения, не создавая поток для каждого соединения, тем самым улучшая общую производительность. Для достижения такого же эффекта, как и асинхронная модель, первая модель (синхронная) должна быть многопоточной. Более подробно см.: шаблон проактора (я на самом деле изучаю шаблон проактора, который используется для асинхронной модели из этого документа. Здесь он содержит описание типичного синхронного ввода /O ).
Правильно ли я понимаю это по этому вопросу? Если это так, это означает, что асинхронный сервер может принимать запросы и возвращать результаты асинхронно (первый запрос на соединение на сервере не должен быть первым, чтобы ответить)? По сути, асинхронная модель не использует потоки (или потоки используются в отдельных компонентах, например, в компоненте Proactor, мультиплексор асинхронного события (boost:: asio), а не при создании всего пакета приложений клиент-сервер, который описывается в многопоточной модели в документе Proactor Pattern, раздел 2.2 - Общие ловушки и ловушки обычных Concurrency моделей).