@ Родди - я уже прочитал ссылки, на которые вы указываете, на них обе ссылаются из презентации Пола Тима «Тысячи потоков и блокировка ввода-вывода - старый способ написания Java-серверов снова новый».
Однако некоторые вещи, которые не обязательно выпрыгивают из презентации Пола, заключаются в том, что он указал -Xss: 48k для JVM при запуске и что он предполагает, что реализация NIO JVM эффективна для того, чтобы он быть действительным сравнением.
Indy не определяет аналогично сжатый и строго ограниченный размер стека. Нет вызовов BeginThread (подпрограммы создания потока Delphi RTL, которую вы должны использовать в таких ситуациях) или CreateThread (необработанный вызов WinAPI) в кодовой базе Indy.
Размер стека по умолчанию хранится в PE, и для компилятора Delphi он по умолчанию равен 1 МБ зарезервированного адресного пространства (пространство за страницей фиксируется ОС в 4K-блоках; фактически, компилятору необходимо сгенерировать код для прикасайтесь к страницам, если в функции> 4K локальных элементов, потому что расширение контролируется ошибками страниц, но только для самой нижней (сторожевой) страницы в стеке). Это означает, что вы исчерпаете адресное пространство после максимально 2000 одновременных потоков, обрабатывающих соединения.
Теперь вы можете изменить размер стека по умолчанию в PE с помощью директивы {$ M minStackSize [, maxStackSize]}, но это повлияет на все потоки , включая основной поток. Я надеюсь, что вы не делаете много рекурсии, потому что 48K или (аналогично) не много места.
Теперь, прав ли Пол в отношении неэффективности асинхронного ввода-вывода для Windows, в частности, я не уверен на 100% - я должен был бы измерить это, чтобы быть уверенным. Однако я знаю, что аргументы о том, что многопоточное программирование проще, чем асинхронное программирование на основе событий, представляют ложную дихотомию .
Асинхронному коду не нужно , чтобы быть основанным на событиях; оно может быть основано на продолжении, как в .NET, и если вы укажете закрытие в качестве продолжения, вы получите состояние, сохраняемое для вас бесплатно. Более того, преобразование из кода в линейном стиле потока в асинхронный код в стиле продолжения может быть выполнено механически с помощью компилятора (преобразование CPS является механическим), поэтому не требуется никаких затрат для ясности кода.