1

GoogleAppEngineでタスクキューを使用する際に問題が発生しました。私はこのサイトと同じことをやってみました: https ://developers.google.com/appengine/docs/python/taskqueue/overview-push

しかし、私のタスクは実行されていないようです。次のエラーが発生します。

警告2012-11-2515:29:21,258taskqueue_stub.py:1978]タスクtask1の実行に失敗しました。このタスクは12.800秒で再試行します

コードは、これらを除いて主に同じです。

class CounterWorker(webapp.RequestHandler):
  def init(self): # should run at most 1/s
    def txn():
      logging.info("bla")
    db.run_in_transaction(txn)

そして私はこのようなタスクを追加するだけです:

taskqueue.add(url='/worker')

私が本当に望んでいるのは、タイムアウトしないコードのブロックを実行することです。だから私はタスクキューを使うことができると読んだ。しかし、私はそれを機能させることができないようです。

4

2 に答える 2

5

デフォルトでは、タスクキューは、URLにマップされているハンドラー(この場合は/ worker、CounterWorkerにマップされている必要があります)にPOSTリクエストを送信します。したがって、CounterWorkerメソッドでpostメソッドを定義する必要があります。

class CounterWorker(webapp.RequestHandler):
  def post(self):
    def txn():
      logging.info("bla")
    db.run_in_transaction(txn)

あなたのコメントは、タスクは1/sだけ実行する必要があることを示唆しています。これは、 queue.yaml構成ファイルで定義できます。

また、タスクキューには10分のタイムアウトがあるため、永久に実行されることはありません。これを修正するには、それらをチェーンするか、据え置きAPIを使用してみてください。長時間実行されるプロセスの場合、バックエンドAPIの方がおそらく適しています。

于 2012-11-25T16:09:58.547 に答える
4

タスク「バニラ」を実行したいだけの場合は、遅延関数を見てください。

延期されたライブラリでのバックグラウンド作業

from google.appengine.ext import deferred

  def do_something_expensive(a, b, c=None):
      logging.info("Doing something expensive!")
      # Do your work here

  # Somewhere else
  deferred.defer(do_something_expensive, "Hello, world!", 42, c=True)

関数を直接渡すことができるので、url/webappハンドラーは必要ありません。

于 2012-11-25T16:11:21.950 に答える