Почему Google App Engine поддерживает только один поток выполнения?
У кого-нибудь есть идея, почему Google App Engine разрешает только один поток выполнения для развернутого приложения?
Я лично считаю, что он имеет какое-то отношение к предсказуемости приложения, чтобы Google мог более надежно оценивать свою производительность. Похоже, что на сайте Google не было никакого обоснования, связанного с однопоточным исполнением, поэтому мой вопрос.
Наличие приложения, которое уже многопоточно и в настоящее время развернуто на виртуальной машине, означает, что мне трудно перейти в облако с учетом этого ограничения.
РЕДАКТИРОВАТЬ. Я отметил ответ ниже, поскольку вполне правдоподобно, что потоки не разрешены из-за требований горизонтального масштабирования. Естественно, все потоки выполняются в одном пространстве процессов, и, поскольку GAE может запускать много процессов для вашего приложения, было бы сложно обмениваться потоками. Тем не менее, я по-прежнему считаю, что небольшой пул потоков для каждого процесса будет полезен и может помочь переносить приложения в облако. Я попрошу это как функцию. Спасибо за обсуждение!
Ответы
Ответ 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()