Подтвердить что ты не робот

Почему Google App Engine поддерживает только один поток выполнения?

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

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

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

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

4b9b3361

Ответ 1

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

ИЗМЕНИТЬ

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

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

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

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

Ответ 2

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

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

Ответ 3

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

ИЗМЕНИТЬ

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

Ответ 4

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

Ответ 5

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

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

Фоновые потоки

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

Пример кода:

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()