Потоки Python GAE не выполняются параллельно - PullRequest
9 голосов
/ 19 февраля 2012

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

t1.start()
t2.start()
t3.start()

t1.join()
t2.join()
t3.join()

Приложение работает нормально, за исключением того факта, что потоки работают последовательно, а не одновременно (это подтверждается печатью временных меток в начале / концеметод run () каждого потока).Я следовал инструкциям, приведенным в http://code.google.com/appengine/docs/python/python27/using27.html#Multithreading для включения многопоточности

Мой app.yaml выглядит так:

application: myapp
version: 1
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico

- url: /stylesheet
  static_dir: stylesheet

- url: /javascript
  static_dir: javascript

- url: /pages
  static_dir: pages

- url: .*
  script: main.app

Я убедился, что мой локальный GoogleAppLauncher использует python 2.7, установивпуть явно указан в настройках.

У моих потоков среднее время выполнения 2-3 секунды, в течение которых они выполняют открытый вызов URL и выполняют некоторую обработку результата.

Я что-то не так делаю или отсутствует какая-либо конфигурация для включения многопоточности?

Ответы [ 3 ]

18 голосов
/ 20 февраля 2012

Испытываете ли вы это в dev_appserver или после загрузки приложения в производственную службу? Из вашего упоминания о GoogleAppLauncher это звучит так, как будто вы можете видеть это в dev_appserver; dev_appserver не эмулирует многопоточное поведение рабочих серверов, и вы будете удивлены, обнаружив, что он прекрасно работает после развертывания приложения. (Если нет, добавьте комментарий здесь.)

Еще одна идея: если вы в основном ожидаете urlfetch, вы можете запустить много вызовов urlfetch параллельно, используя асинхронный интерфейс для urlfetch: http://code.google.com/appengine/docs/python/urlfetch/asynchronousrequests.html

Этот подход не требует потоков. (Он по-прежнему неправильно распараллеливает запросы в dev_appserver; но на производственных серверах работает правильно.)

1 голос
/ 19 февраля 2012

Замечания о многопоточности для GAE предназначены только для обработки запросов - они принципиально не меняют работу потоков Python.В частности, примечание «Сведения о реализации CPython» в документах по потоковому модулю по-прежнему применяется.

Стоит также упомянуть примечание в разделе «Песочница» документации GAE:

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

0 голосов
/ 20 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...