Как организовать несколько вызовов выборки URL-адресов с помощью GAE?

Я должен выполнять тысячи вызовов по выборке URL в течение дня. Все вызовы одинаковые, только параметры меняются - way и date.

В настоящее время я использую несколько записей cron для выполнения таких вызовов:

- description: get data
  url: /admin/getdata?d=way1,way2,way3,way4,...,way12
  schedule: every day 8:30

- description: get data
  url: /admin/getdata?d=way13,way14,way15,way16,...,way24
  schedule: every day 8:40

...

- description: get data
  url: /admin/getdata?d=way99,way100,way101,way102,...,way123
  schedule: every day 9:20

Затем в моем обработчике getdata я анализирую полученный параметр d и выполняю несколько urlfetches:

for date_ in dates:
    for way in d:
        response = urlfetch.Fetch('http://example.com?way='+way+'&date='+date_, deadline=60, headers=headers, follow_redirects=True) 

Но мне это не очень помогает - все же 60 секунд, отведенных на работу cron, недостаточно.

Я думал запускать задание cron каждые десять минут, но я должен хранить где-то возможные ways и dates, отмечать уже выполненные запросы, а затем сбрасывать их (чтобы иметь возможность выполнить все снова на следующий день).

Есть ли лучший способ сделать то же самое?


person LA_    schedule 20.05.2014    source источник


Ответы (2)


Или одно задание cron, которое порождает задания в очереди для всех остальных URL-адресов. Это можно сделать в модуле по умолчанию бесплатно. Я бы установил параметр countdown, чтобы разнести их, чтобы не создавать слишком много экземпляров. Также упрощает app.yaml.

person GAEfan    schedule 20.05.2014
comment
Спасибо. Но что означает batch в документации GAE — developers.google.com/appengine/ документы/python/taskqueue/? В нем говорится: «Максимальное количество задач, которые можно добавить в пакет: 100». Могу ли я иметь только 100 задач? - person LA_; 20.05.2014
comment
Да, вы можете установить партию. Это снижает скорость их выполнения. Если вы установите значение 100, у вас будет одновременно выполняться 100 задач. Это почти наверняка создаст несколько новых экземпляров для вашего приложения, что вытолкнет вас за пределы бесплатной квоты. Но, если вы не возражаете против небольшой стоимости, это будет работать очень хорошо. - person GAEfan; 20.05.2014
comment
Наконец, я выбрал ваш подход, поскольку, когда я пытался использовать API модулей (что предложил @AndreiVolgin), заданных (в рамках бесплатного приложения) часов экземпляра было недостаточно для моей задачи. - person LA_; 21.05.2014

Лучший способ — иметь только одно задание cron в день, которое извлекает все URL-адреса. Все, что вам нужно сделать, это нацелить это задание cron на экземпляр бэкэнда, который не имеет ограничения по времени.

Используйте модули для создания такого экземпляра и добавьте параметр "цель" в ваша работа cron.

person Andrei Volgin    schedule 20.05.2014
comment
Андрей, спасибо. Вы говорите о бесплатном приложении GAE? Где я могу прочитать об этом? - person LA_; 20.05.2014
comment
Я добавил ссылку на API модулей. - person Andrei Volgin; 20.05.2014