Я работаю с ASP.NET. ИМХО, поддержка асинхронного программирования в ASP.NET прекрасна. То есть мы можем использовать метод пары BeginXXXX / EndXXXX для улучшения масштабируемости для ресурсоемкой задачи.
Например, одна операция должна получить огромные данные из базы данных и отобразить их на ответной веб-странице. Если у нас эта операция синхронная. Поток, обрабатывающий этот запрос, будет занят в течение всего жизненного цикла страницы. Поскольку потоки ограничены в ресурсах, всегда лучше программировать работу с вводом / выводом асинхронно. То есть ASP.NET выделит поток для вызова метода BeginXXXX с функцией обратного вызова. Поток вызывает BeginXXXX немедленно возвращается и может быть организован для обработки других запросов. Когда работа выполнена, вызывается функция обратного вызова, и ASP.NET вызывает EndXXXX, чтобы получить фактический ответ.
Эта модель асинхронного программирования может полностью использовать преимущества потоковых ресурсов. Несмотря на то, что ThreadPool имеет ограничение, он может обрабатывать гораздо больше запросов. Однако, если мы программируем синхронно и каждый запрос требует длительных операций ввода-вывода, количество одновременных запросов не будет превышать размер пула потоков.
Недавно у меня появилась возможность изучить другие решения для веб-разработки, такие как PHP и Ruby on Rails. К моему удивлению, эти решения не имеют аналога модели асинхронного программирования. Каждый запрос обрабатывается одним потоком или процессом в течение всего жизненного цикла. То есть поток или процесс занят до отправки последнего бита ответа.
Есть что-то похожее на асинхронно (http://netevil.org/blog/2005/may/guru-multiplexing),, но суть в том, что для запроса всегда занят один поток или процесс. Это не похоже на ASP.NET.
Итак, мне интересно: почему у этого популярного веб-решения нет модели асинхронного программирования, такого как ASP.NET? Почему только ASP.NET развивается, чтобы использовать асинхронный подход?
Это потому, что PHP и Ruby-on-Rails в основном развернуты в Linux? И Linux не страдает от снижения производительности процессов / потоков, как Microsoft Windows?
Или, на самом деле, есть асинхронное решение для PHP и Ruby-on-Rails, которое я не нашел?
Спасибо.