Python и Ruby также имеют такую структуру, но поскольку библиотеки, содержащие синхронный код, неизбежно используются в реальном использовании, они не выросли. Перед Node.js программирование на стороне сервера JavaScript было почти пустым, поэтому Node.js смог создать библиотеку кода, где весь IO был асинхронным.
Узкие места большинства веб -приложений находятся в IO, а именно, читать и записать диски, читать и записать сети, а также читать и писать базы данных. Какую стратегию использовать для ожидания этого периода времени стала ключевым моментом в повышении производительности.
Стратегия PHP: запустите несколько процессов, подождите, пока IO завершит напрямую. Недостатки: несколько процессов потребляют несколько памяти, что затрудняет обмен данными между процессами.
C/C ++ Общая стратегия: запустить многопоточное, и программа поддерживает сам состояние блокировки. Недостатки: высокие затраты на развитие, легко совершать ошибки и трудно отлаживать.
Python (Tornado): несколько запросов выполняются по очереди в одном процессе и переключаются на другой запрос, когда я встречаюсь с IO. Недостатки: для одного запроса время все еще не используется наиболее эффективно.
Какое «время использования наиболее эффективно»? Например, теперь есть два не связанных с этим запроса базы данных. В PHP один из них обычно выполняется первым, а второй будет выполнен после завершения выполнения (общее время - A + B). Очевидно, это не самое эффективное. Два запроса должны быть выполнены одновременно, а время - максимум (а, б).
Проблема с Python и другими языками, которые поддерживают многопоточное чтение, заключается в том, что на языковом уровне программистам трудно сообщить виртуальным машинам, что две операции должны выполняться одновременно. Даже если есть способ, это довольно хлопотно. Большинство людей слишком ленивы (не стоит использовать). Поскольку node.js безумно заставляет все исполнение ввода, а также можно сказать, что программисты node.js также можно сказать, что знакомы с этим. В сочетании с некоторыми библиотеками для улучшения читаемости кода (обещание, асинхрон) это может легко позволить неактуальным операциям выполняться параллельно.
В приведенном выше говорится о реализации асинхронного ввода -индикатора, так где, где отражаются преимущества асинхронного IO? На самом деле, асинхронный io не может волшебным образом уменьшить давление на сервер. Чтобы добавить сервер, вам все еще нужно добавить сервер, но асинхронный io сократит время одного запроса и удалит бессмысленное время ожидания в одном запросе. Следовательно, запросы, обработанные во время единицы, не изменились, но время обработки для каждого запроса было уменьшено. С этой точки зрения сервер также сохраняет некоторые ресурсы, то есть поддерживает память, потребляемую каждым запрошенным подключением.