Разница в производительности между синхронным обработчиком HTTP и асинхронным обработчиком HTTP

Есть ли разница в производительности между синхронным обработчиком HTTP и асинхронным обработчиком HTTP? IHttpHandler против IHttpAsyncHandler

Почему выбирают одно другому?

Каковы преимущества?


person DarthVader    schedule 18.08.2011    source источник


Ответы (2)


ASP.NET использует пул потоков для обработки входящих HTTP-запросов.

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

Напротив, при использовании IHttpAsyncHandler существует механизм, позволяющий запросу зарегистрировать обратный вызов и вернуть поток пула потоков в пул до того, как запрос будет полностью обработан. Поток пула потоков начинает некоторую обработку запроса. Вероятно, вызывает какой-то асинхронный метод для вызова базы данных или веб-службы или чего-то еще, а затем регистрирует обратный вызов для вызова ASP.NET, когда этот вызов возвращается. В этот момент поток пула потоков, который обрабатывал HTTP-запрос, возвращается в пул для обработки другого HTTP-запроса. Когда вызов базы данных или что-то еще возвращается, ASP.NET запускает зарегистрированный обратный вызов в новом потоке пула потоков. Конечным результатом является то, что у вас нет потоков пула потоков, ожидающих операций ввода-вывода, и вы можете использовать свой пул потоков более эффективно.

Для приложений с очень высоким уровнем параллелизма (сотни или тысячи действительно одновременных пользователей) IHttpAsyncHandler может обеспечить огромный прирост параллелизма. При меньшем количестве пользователей все еще может быть преимущество, если у вас есть очень длинные запросы (например, длинный запрос на опрос). Однако программирование с использованием IHttpAsyncHandler более сложное, поэтому его не следует использовать, когда это действительно не нужно.

person Samuel Neff    schedule 18.08.2011
comment
Спасибо за ответ @Samuel Neff, не могли бы вы поделиться ссылками, где я могу подробнее узнать о разнице в использовании. Необходимо сделать это абсолютно ясным. - person Johnny_D; 14.05.2013

Нет никакой разницы в производительности, кроме управления другим потоком.

Синхронный код проще. Вы отправляете запрос, и поток останавливается, пока не будет получен ответ. Затем вы можете обрабатывать ответ и ошибки одним и тем же методом. Легко читать и отлаживать. Если вы запустите этот код в потоке графического интерфейса пользователя, Windows может сообщить, что ваша программа «не отвечает», если вы не получите ответ быстро.

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

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

person Hand-E-Food    schedule 18.08.2011
comment
Вы говорите о синхронизации и асинхронности в целом, и это тоже неправильно. Async лучше работает в тестах с точки зрения общей пропускной способности. - person Muhammad Hasan Khan; 18.08.2011
comment
По общему признанию, я сделал предположение. Чтобы уточнить, вы говорите, что несколько параллельных асинхронных запросов лучше, чем несколько последовательных синхронных запросов? Я бы в это поверил. Как насчет одного синхронного запроса по сравнению с одним асинхронным запросом? - person Hand-E-Food; 18.08.2011
comment
Да, я говорил о нескольких параллельно. По единичному случаю разницы нет. - person Muhammad Hasan Khan; 18.08.2011
comment
вся программа для зависания очень неточная. Во время ожидания замораживается только один поток, но сотни других потоков все еще активны для обработки других HTTP-запросов. Вы путаете потоки графического интерфейса Windows и потоки обработки HTTP ASP.NET. - person Samuel Neff; 18.08.2011
comment
@ Сэмюэл, ты прав. Я подхожу к этому с точки зрения однопоточной и многопоточной, а не асинхронной и синхронизации. - person Hand-E-Food; 18.08.2011