DeadlineExceededExceptions を回避するには、複数の Deferred Push Task Queuesを使用します。タスク キューを使用すると、複数のタスクをより小さな作業単位に簡単に分割できます。これにより、個々のタスクがタスク キューに割り当てられた 10 分のしきい値を超えないようにすることができます。
タスク キュー API を使用すると、アプリケーションは、ユーザー リクエストによって開始された、ユーザー リクエストの外部で作業を実行できます。アプリが何らかのバックグラウンド作業を実行する必要がある場合、Task Queue API を使用して、その作業をタスクと呼ばれる小さな個別の単位に編成できます。アプリは、後で実行するタスクをタスク キューに追加します。
Deferred Task Queueは Push Task Queue であり、基本的にスケジュールされたタスクであり、いつ起動するかがあらかじめ決められています。Deferred Task の作成方法の短いサンプルを次に示します。
import logging
from google.appengine.ext import deferred
def do_something_expensive(a, b, c=None):
logging.info("Fetching Twitter feeds!")
# Fetch the Twitter data here
# Somewhere else - Pass in parameters needed by the Twitter API
deferred.defer(do_something_expensive, "BobsTwitterParam1", "BobsTwitterParam2", c=True)
deferred.defer(do_something_expensive, "BobsFriendTwitterParam1", "BobsFriendTwitterParam2", c=True)
Twitter ユーザーからデータを取得するプロセスは、本質的に再帰的です。これは、フォロワーのフォロワーなどのデータを取得しているためです。単一のプロセスとしてのこのタスクは、非常にコストがかかる可能性があり、しきい値を超える可能性があります。
タスクは実行を終了し、元の要求から 10 分以内に 200 ~ 299 の HTTP 応答値を送信する必要があります。この期限は、60 秒の期限があるユーザー リクエストとは別のものです。タスクの実行が制限に近づくと、App Engine は (モジュール google.appengine.runtime から) DeadlineExceededError を発生させます。これをキャッチして、作業を保存したり、期限が過ぎる前に進行状況をログに記録したりできます。タスクの実行に失敗した場合、App Engine は構成可能な基準に基づいてタスクを再試行します。
ただし、各 Twitter ユーザーを完全に個別のタスクに分割すると、各タスクは、1 人のユーザーの Twitter の結果を取得するのにかかる時間だけ実行されます。これはより効率的であるだけでなく、ユーザーのデータの 1 つを取得する際に問題が発生した場合、そのタスクのみが失敗し、他のタスクは引き続き実行されます。
つまり、1 つのタスクですべてのデータを取得しようとしないでください。
または、万一、または何らかの理由でこれらのタスクが 10 分のしきい値を超える場合は、バックエンドを調べてください。