2011-08-09 24 views
0

I use現在実行中のタスクの数を保持するカウンタ。タスクが正常に完了したら、私はそれを減らす:すべての再試行が失敗した場合にタスクカウンタを減らす方法はありますか?

 for argument in files_arguments: 
       taskqueue.add(url='/tasks/upload', params={'photo_key': str(photo_file.key()), 
                  'counter_key': counter_key}) 
       # count number of active tasks     
       db.run_in_transaction(increase_counter, counter_key) 

# task handler 
class UploadWorker(webapp.RequestHandler): 
    def post(self): 
      try: 
       result = urlfetch.fetch(...)    
      except DownloadError: 
       logging.error('(TASK) ... DownloadError during file upload') 
       pass 
      except DeadlineExceededError: 
       logging.error('(TASK) ... DeadlineExceededError during file upload') 
       pass 
      if result.status_code == 200: 
       # decrease counter of active tasks 
       db.run_in_transaction(decrease_counter, counter_key) 
      else: 
       self.response.set_status(500) 

をしかし、どのように、私は最後の試みは、タスクカウンタを減少させるために失敗したことを知ることができますか?

答えて

-1

このトランザクションが失敗した場合、別の例外がスローされます。

このタスクハンドラの応答には500のステータスコードがあり、GAEはこれを数回試します。

ところで、ハンドラを複数回呼び出すことができるので、urlfetch.fetch()は数回実行できます。あなたのために働いていますか?

+0

splix、私は最大3回実行するタスクを定義したとしましょう。それは3回実行され、3回失敗しました。しかし、それ以上の試行はないので、カウンターを減らす必要があります。私は他のいくつかの例外をキャッチしてそれを行う必要がありますか?それではどの例外? (ファイルが何度もアップロードされても問題ありません) –

+0

まず、再試行の方法を設定できます( 'TaskRetryOptions'参照)。そして、2番目に、いくつかの時間の後に実行されるいくつかのクリーンアップタスクをスケジューリングし、処理されたかどうかチェックします( 'Task.eta'参照)。 –

0

障害が多すぎるためにタスクがキャンセルされた場合、コードを実行する方法はありません。代わりに、何かがうまくいかないときは自分の再試行カウンタをチェックし、最後の再試行では失敗する前にタスクカウンタを減らすようにタスクを構築する必要があります。

あなたが元の質問で言ったように、Pipeline APIのようなものを使用しているはずです。タスク用の単一のグローバルデータストアカウンタを維持すると、スループットが大幅に制限されます。

+0

答えの最初の部分に関して - これは私です今質問しています。これが最終的な再試行であるかどうかをどのように知ることができますか –

+0

@ LA_リトライ回数をチェックし、コード内の定数と比較することで、 –

関連する問題