GAE/Pタスクキューで実行頻度の設定と、無限リトライ防止

GAE/Pタスクキューで実行頻度の設定と、無限リトライ防止


defaultタスクキューに処理を登録


from google.appengine.api.labs import taskqueue

taskqueue.add(url='/job, params={'param1': "batch", 'mode': 'change' })

 /jobにparam1とmodeという変数をPostして処理させる。これが基本形。


タスクキューの無限リトライを防止


from google.appengine.api.labs import taskqueue

import logging

class Job(webapp.RequestHandler):

            

        

    def post(self):

       

        if( int(self.request.headers.environ['HTTP_X_APPENGINE_TASKRETRYCOUNT']) > 3):

            logging.error('jog retry error(over 3 times)')

            return


  ...処理を記述

 太字部分を追加すると、3回リトライしてダメだったらエラーログを残して処理を終了する。


デフォルト以外の設定でタスクを処理


 デフォルト以外のキューを設定すると、実行頻度とか、一度に実行するタスクの数を変えられる。
queue.yamlに以下のように設定

queue:

- name: task_per_minute

  rate: 1/m

  bucket_size: 1

- name: speed_queue

  rate: 5/s

 rateの1/mは一分あたり一回実行の意味。5/sは秒あたり5回実行。bucket_sizeは、一度に並列処理する数。1だとひとつひとつ処理するようだ。 5/hと書いて、だいたい12分間隔で実行してくれるのかは未確認。
 上記のように設定した、default以外のキューにタスクを投入するときはこう書く。

from google.appengine.api.labs import taskqueue

mytask = taskqueue.Queue('task_per_minute')

task = taskqueue.Task(url='/job, params={'param1': "batch", 'mode': 'change' })

mytask .add(task)

 追記)上記の方法だと、「リトライエラー」が無限に発生する、という自体に陥ることがあった。色々調べた結果、queue.yamlにリトライ回数を記述するのが確実なようだ。

queue:

- name: task_per_minute

  rate: 1/m

  bucket_size: 1

  retry_parameters:

    task_retry_limit: 3

- name: speed_queue

  rate: 5/s 

  retry_parameters:

    task_retry_limit: 3

 retry_parametersのtask_retry_limitが最大リトライ数。
 その他のパラメータについては、googleの公式ページを参照。
 google公式ページ queue設定方法: python task queue configuration - google app engine