В чем преимущество одного потока на соединение на HTTP-сервере?

Если бы я программировал HTTP-сервер, почему я должен обрабатывать каждое HTTP-соединение в отдельном потоке?

Я читал множество аргументов в пользу того, что HTTP-серверы, управляемые событиями, быстрее и масштабируемее, чем серверы, управляемые потоками. (Например, см. Ars Technica в Nginx). И все же Apache, самый популярный сервер в мире, управляется потоками. Почему? Каковы преимущества?


person callum    schedule 22.11.2011    source источник


Ответы (1)


Кодировать против него просто.

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

В зависимости от вашей платформы потоки могут быть достаточно дешевыми в наши дни, поэтому при соответствующем объединении в пул модель потоков на запрос работает довольно хорошо для серверов, которым не нужно обрабатывать такое количество запросов одновременно. Конечно, это отстой для длинных опросов или серверов, которым в основном нужно делегировать запросы другим службам, которым может потребоваться «некоторое время», чтобы вернуться (даже если это всего лишь десятая доля секунды). Последний класс серверов должен быть в состоянии обрабатывать огромное количество запросов, поскольку они выполняют только минимальную обработку для выполнения своей работы, но если они перехватывают поток для каждого запроса, просто блокируются в ожидании другого сервиса. возвращаться, это может быть очень расточительно, особенно памяти.

person Jon Skeet    schedule 22.11.2011
comment
Basically, without language support (such as C# and VB will be getting in their next versions)? Хм? .NET имеет очень хорошую поддержку imho (методы начала/конца). Сравните с C или C++ в Linux. ужасный. - person jgauffin; 22.11.2011
comment
@jgauffin: это не поддержка language. Даже с поддержкой библиотеки это по-прежнему болезненно, особенно с точки зрения обработки ошибок. Однако с async/await простые смертные вроде меня могут выполнять разумную работу. - person Jon Skeet; 22.11.2011
comment
да. Это поддержка библиотеки. Но поддержка библиотек в Linux сильно отстает от .NET. Даже winapi/iocp лучше, чем linux. Я просто говорю, что веб-серверы с открытым исходным кодом обычно сначала создаются для Linux или для кросс-платформы, и тогда не так много альтернатив для использования. Поток на запрос — самый простой (и по-прежнему эффективный) подход. - person jgauffin; 22.11.2011