Допустим, у нас есть такая система:
______
{ application instances ---network--- (______)
{ application instances ---network--- | |
requests ---> load balancer { application instances ---network--- | data |
{ application instances ---network--- | base |
{ application instances ---network--- \______/
Приходит запрос, балансировщик нагрузки отправляет его экземпляру сервера приложений, а экземпляры сервера приложений связываются с базой данных (в другом месте локальной сети). Экземпляры приложения могут быть отдельными процессами или отдельными потоками. Просто чтобы охватить все базы, скажем, есть несколько идентичных процессов, каждый из которых имеет пул идентичных потоков службы приложений.
Если база данных работает медленно или сеть перегружена, очевидно, что пропускная способность обслуживания запросов будет ухудшаться.
Теперь, во всем моем опыте, предшествующем Python, это сопровождалось бы соответствующим падением загрузки ЦП приложениями - они бы тратили больше времени на блокировку ввода-вывода и меньше время на выполнение ресурсоемких задач.
Однако мне говорят, что с Python это не так - при определенных обстоятельствах Python эта ситуация может привести к тому, что загрузка процессора Python увеличится на вверх , возможно, до 100% , Что-то в Global Interpreter Lock и нескольких потоках, возможно, заставляет Python тратить все свое время на переключение между потоками, проверяя, есть ли у кого-нибудь из них ответ из базы данных. «Отсюда рост числа однопроцессных управляемых событиями библиотек в последнее время».
Это правильно? Действительно ли потоки службы приложений Python используют больше ЦП, когда их задержка ввода-вывода увеличивается?