Как Go обрабатывает одновременный запрос в Google App Engine

Я немного смущен тем, как Go обрабатывает одновременные запросы в Google App Engine. Поэтому я надеюсь, что кто-то может дать некоторую ясность.

Вот факты, которые я собрал:

Если Go однопоточен в App Engine, то пункт 3 является спорным. Это оставляет 1 и 2. Если Go on App Engine является однопоточным, и потоки необходимы для продолжения выполнения при блокировке ввода-вывода, то кажется, что экземпляр App Engine Go блокирует все goroutines во время ожидания ввода-вывода.

Это правильно? Если нет, как Go concurrency действительно работает в App Engine?

Чтобы помочь количественно оценить вещи. Если бы я должен был открыть соединение в течение 30 секунд. Как одновременные подключения могут поддерживать один экземпляр AE Go?

Спасибо.

EDIT: здесь запрос функции, который позволит Go Instance обрабатывать более 10 одновременных запросов Разрешить настраиваемый предел одновременные запросы за Экземпляр. Пожалуйста, запустите его.

Ответ 1

Экземпляр A Go App Engine допускает 10 одновременных запросов, но работает только один поток ЦП. Фактически, несколько запросов могут обрабатываться одновременно, но только один из них сможет одновременно работать с ЦП. Если один запрос, например, ожидает возврата API-адреса хранилища данных, другой запрос может быть обработан одним и тем же экземпляром.

Ваше утверждение "Если Go однопоточно в App Engine, то пункт 3 является спорным". это неверно. По-прежнему существует ограничение на 10 одновременных запросов в полете для одного экземпляра Go App Engine. Документация немного разглашена словами, когда речь идет о "потоках".

Ответ 2

Я должен признать, что у меня нет внутреннего знания AppEngine. Это все предположения и догадки, но я думаю, что это несколько разумно.

Ваше приложение никогда не достигнет десяти нитей. Это связано с тем, что существует очень мало причин для создания потоков. Во-первых, максимальное количество запущенных goroutines устанавливается равным единице в обеспечивать безопасность памяти. Во-вторых, в отличие от обычной программы go, на движке приложения фактически не нужно делать системные вызовы. Единственный раз, когда он работает, - это общение. Все IO в appengine могут быть объединены в одну цепочку epoll. Это означает, что все, что вам нужно, это два потока в любой момент времени. Затем вы можете добавить третий или четвертый поток в случае, когда каждый раз вам нужно запускать другие системные вызовы, такие как выделение памяти и прием/закрытие соединений. Это быстрые системные вызовы, которые блокируются в течение очень небольшого промежутка времени. Даже при использовании этих других системных вызовов вы все еще очень далеки от десяти пределов потока.

Concurrency не влияет, потому что, в конце концов, все, что вы делаете в appengine, сводится к ожиданию чего-то по сети, чтобы вернуться. Вам не нужно несколько потоков, чтобы делать много вещей одновременно.