4

タスク キューを介して AppEngine でタスクを実行しようとしていますが、それでも 60 秒のタイムアウトに直面しているようです。宣伝されているように制限は10分であるべきだと思うので、私が間違って何をしているのかわかりません.

urlfetch.fetch()犯人と思われる電話がかかってきました。私の電話は:

urlfetch.fetch(url, payload=query_data, method=method, deadline=300)

スタック トレースの末尾には、次の直前に url fetch 呼び出しをトリガーするメソッドが示されていますDeadlineExceededError

File "/base/data/home/apps/s~mips-conversion-scheduler/000-11.371629749593131630/views.py", line 81, in _get_mips_updated_data
policies_changed = InquiryClient().get_changed_policies(company_id, initial=initial).json()

タスク キュー情報を見ると、次のように表示されます。

Method/URL: POST /tasks/queue-initial-load
Dispatched time (UTC): 2013/11/14 15:18:49
Seconds late: 0.18
Seconds to process task: 59.90
Last http response code: 500
Reason to rety: AppError

タスクを処理する私のビューは次のようになります。

class QueueInitialLoad(webapp2.RequestHandler):
def post(self):
    company = self.request.get("company")
    if company:
        company_id = self.request.get("company")
        queue_policy_load(company_id, queue_name="initialLoad", initial=True)

queue_policy_load が urlfetch 呼び出しをトリガーするメソッドです。

10 分ではなく 60 秒のタイムアウトに制限されている、明らかに欠けているものはありますか?

4

3 に答える 3

1

少し一般的すぎるかもしれませんが、ループを閉じるのに役立つ可能性のある考えをいくつか紹介します。タスク キューには、プッシュ キューとプル キューの 2 種類があります。プッシュ キュー タスクは自動的に実行され、App Engine アプリでのみ使用できます。一方、プル キュー タスクはリースされるのを待っており、アプリ外のワーカーが利用でき、バッチ化できます。

キューを構成する場合は、キュー構成ファイルで行うことができます。Java ではこれが queue.xml ファイルで行われ、Python では queue.yaml ファイルで行われます。具体的には、プッシュ キューに関して言えば、プッシュ キュー タスクはハンドラー (URL) によって POST 要求として処理されます。彼ら:

  1. できるだけ早く実行される
  2. 新しいインスタンスが発生する可能性があります (フロントエンドまたはバックエンド)
  3. タスクの期間を 10 分に制限する
  4. ただし、タスクがバックエンドで実行されている場合、期間は無制限です

名前付きプッシュ キューにタスクを追加する方法を示す Python コードの簡単な例を次に示します。詳細情報が必要な場合は、タスク キューの Google 開発者ページをご覧ください: https://developers.google.com/appengine/docs/python/taskqueue/

名前付きプッシュ キューへのタスクの追加:

queue = taskqueue.Queue("Qname")
task = taskqueue.Task(url='/handler', params=args)
queue.add(task)

一方、プル キューを使用したいとします。次を使用して、Python のタスクをプル キューに追加できます。

queue = taskqueue.Queue("Qname")
task = taskqueue.Task(payload=load, method='PULL')
queue.add(task)

次に、Python で次のアプローチを使用して、これらのタスクをリースすることができます。

queue = taskqueue.Queue("Qname")
tasks = queue.lease_tasks(how-long, how-many)

プル キューの場合、タスクが失敗すると、App Engine は成功するまで再試行することに注意してください。

一般的な視点を提供するという点で役立つことを願っています!

于 2014-04-05T07:14:53.203 に答える
0

GAE が進化したため、この回答は、「バックエンド」インスタンスの概念が廃止された今日に関連しています。GAE アプリは、サービス (別名モジュール) として構成し、manualスケーリング ポリシーを使用して実行できます。そうすることで、より長いタイムアウトを設定できます。ポリシーを使用してアプリを実行していた場合autoscaling、urlfetch は 60 秒に制限され、キューに入れられたタスクは 10 分に制限されます: https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine

于 2016-10-17T12:25:49.273 に答える
0

タスク キューには 10 分の期限がありますが、Urlfetch 呼び出しには 1 分の期限があります。

最大期限 (リクエスト ハンドラ) 60 秒

更新: 意図した動作は、TaskQueue での実行時に最大 10 分の URLFetch 期限を持つことでした。このバグを参照してください。

于 2013-11-14T15:45:15.437 に答える