Почему Google App Engine поддерживает только один поток выполнения? - PullRequest
12 голосов
/ 27 сентября 2010

Кто-нибудь имеет представление, почему Google App Engine разрешает только один поток выполнения для развернутого приложения?

Я лично считаю, что это как-то связано с предсказуемостью приложения, так что Google может оценитьего производительность более надежна.Похоже, что на сайте Google нет никакого обоснования относительно однопоточного исполнения, поэтому мой вопрос.

Наличие приложения, которое уже является многопоточным и в настоящее время развернуто на ВМ, означает, что мне трудно перемещатьк облаку с учетом этого ограничения.

РЕДАКТИРОВАТЬ : Я отметил ответ ниже, так как звучит вполне правдоподобно, что потоки не разрешены из-за требований горизонтального масштабирования.Естественно, все потоки выполняются в одном и том же пространстве процессов, и, поскольку GAE может запускать множество процессов для вашего приложения, было бы сложно совместно использовать потоки.Тем не менее, я все еще думаю, что небольшой пул потоков для каждого процесса был бы полезен и мог бы помочь перенести приложения в облако.Я буду просить это как особенность.Спасибо за обсуждение!

Ответы [ 5 ]

11 голосов
/ 27 сентября 2010

Существует ограниченная альтернатива порождения потоков в Google App Engine, называемая очередями задач: http://code.google.com/appengine/docs/python/taskqueue/

EDIT

С http://code.google.com/appengine/docs/java/runtime.html#The_Sandbox:

Чтобы разрешить App Engine распространять запросы на приложения через несколько веб-серверов, и для предотвращения одно приложение от вмешательства в другое приложение работает в ограниченная среда «песочницы». В эта среда, приложение может выполнять код, хранить и запрашивать данные в хранилище данных App Engine, используйте приложение Движок почты, выборка URL и пользователи услуги, и изучить веб-пользователя запросить и подготовить ответ.

Как отмечали другие люди, потоки не поддерживаются в целях безопасности для приложений-песочниц.

Существует множество других ограничений в Google App Engine, которые заставляют разработчиков создавать масштабируемые приложения. Я считаю, что очереди задач являются еще одним из этих ограничений, потому что, в отличие от создания потока на текущем компьютере, обрабатывающего HTTP-запрос, задача помещается в очередь, которая затем может быть запланирована и выполнена другими машинами. Очереди задач позволяют распределять и распределять работу между компьютерами в масштабируемой форме.

6 голосов
/ 27 сентября 2010

App Engine использует модель выполнения, основанную на запросах, то есть вся работа ограничивается запросом, будь то работа с пользователем или инициированная другой системой, такой как очередь задач.Хотя было бы возможно использовать потоки в этой среде, большинство случаев использования, где многопоточность полезна, включают в себя длительные процессы, для которых App Engine не предназначен, или автономную работу, в этом случае вам лучшеиспользуя масштабируемые средства, предоставляемые App Engine, такие как очередь задач.

Иными словами, потоки являются конкретным решением общей проблемы.App Engine предоставляет альтернативу для большинства случаев использования в виде очереди задач.

3 голосов
/ 27 сентября 2010

Я думаю, что это вводящий в заблуждение вопрос. Механизм приложений не позволяет вашему приложению создавать потоки, но механизм приложений может запускать несколько экземпляров вашего приложения или использовать какой-либо многопоточный или многопроцессорный обработчик запросов. Я не знаю конкретных деталей, но без какого-либо параллелизма движок приложения был бы довольно бесполезной платформой.

EDIT

Мой первоначальный ответ неверно подразумевал, что потоки не являются полезной функцией, они имеют много применений, но большинство веб-разработчиков не управляют потоками в своих приложениях. Потоки обычно управляются на нижних уровнях стека приложений.

2 голосов
/ 27 сентября 2010

Я не знаю точно, но я полагаю, что это, вероятно, по соображениям безопасности. Если они допускают несколько потоков, они открываются для бомбы fork() (или эквивалентного потока). Кроме того, это значительно упрощает управление ресурсами - Google необходимо управлять ресурсами только одного потока на приложение.

0 голосов
/ 21 ноября 2017

Новая функция, запущенная после того, как был задан этот вопрос: фоновые темы .

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

Фоновые темы

Код, выполняемый на экземплярах ручного или базового масштабирования, может запустить фоновый поток, который может пережить запрос, который его породил. Это позволяет экземплярам выполнять произвольные периодические или запланированные задачи или продолжать работать в фоновом режиме после возврата запроса пользователю.

Пример кода:

from google.appengine.api import background_thread

# sample function to run in a background thread
def change_val(arg):
    global val
    val = arg

if auto:
    # Start the new thread in one command
    background_thread.start_new_background_thread(change_val, ['Cat'])
else:
    # create a new thread and start it
    t = background_thread.BackgroundThread(
        target=change_val, args=['Cat'])
    t.start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...