Очереди задач или многопоточность в движке приложения Google

У меня есть сервер на Google App Engine. Одна из моих задач — сопоставлять огромный набор записей с другим. Это занимает очень много времени, если мне нужно сопоставить 10000 записей со 100. Каков наилучший способ реализовать это.

Я использую стек Web2py и развернул свое приложение в Google App Engine.


person Shirish    schedule 28.01.2012    source источник


Ответы (3)


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

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

person Sam Holder    schedule 28.01.2012
comment
Это не запрос веб-службы. Это задание cron, которое выполняется через равные промежутки времени. Итак, моя основная работа состоит в том, чтобы разбить 1000 сравнений на меньшее и добавить задачи в очередь. Это имеет какое-либо значение? - person Shirish; 28.01.2012

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

Сам GAE может быть многопоточным, что означает, что один экземпляр внешнего интерфейса может обрабатывать несколько HTTP-запросов одновременно.

В вашем случае лучший способ добиться параллельного выполнения задачи - это очередь задач.

person Peter Knego    schedule 28.01.2012
comment
Вы имеете в виду, что многопоточность не поддерживается в python27 на GAE? - person Chameleon; 29.06.2012
comment
Начиная с SDK 1.6.4 вы можете использовать фоновые потоки только на серверных экземплярах: Developers.google.com/appengine/docs/python/backends/ - person Peter Knego; 30.06.2012

Базовая структура того, что вы делаете, заключается в том, чтобы задание cron отвечало за разделение работы на более мелкие блоки и выполнение каждого блока с очередью задач. Полезной нагрузкой для каждой задачи будет информация, которая идентифицирует объекты в первом наборе (например, набор ключей). Каждая задача будет выполнять любые запросы, необходимые для соединения сущностей в первом наборе с сущностями во втором наборе, и сохранять промежуточные (или, возможно, окончательные) результаты. Вы можете настроить размер полезной нагрузки и скорость очереди задач, пока они не будут работать так, как вы хотите.

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

http://www.youtube.com/watch?v=EIxelKcyCC0 http:// code.google.com/p/appengine-mapreduce/

person Dan Sanderson    schedule 28.01.2012
comment
Большое спасибо. Я просмотрел видео, о котором вы упомянули, но у меня есть вопрос. Разве MapReduce Pipeline не гарантирует обработку больших наборов данных. Должен ли я действительно разбивать сравнение на более мелкие фрагменты? - person Shirish; 30.01.2012
comment
Правильно, утилита MapReduce позаботится о фрагментации и выполнении. Вы предоставляете карту и уменьшить. :) В моем ответе выше разделение работы на более мелкие блоки — это то, что вы бы сделали, если бы не использовали MapReduce, а реализовали это напрямую с задачами и произвольным объемом данных. Думая об этом таким образом, вы получаете ручку, которую вы можете повернуть, чтобы настроить производительность: количество записей для каждой задачи. Вы можете создать одну задачу для каждой записи из 10 000 задач, но это может быть не лучшим использованием ресурсов. - person Dan Sanderson; 01.02.2012