1

在谷歌应用引擎中使用任务队列时遇到一些问题。我尝试在此站点中执行相同的操作: https ://developers.google.com/appengine/docs/python/taskqueue/overview-push

但似乎我的任务从未执行,我收到此错误:

警告 2012-11-25 15:29:21,258 taskqueue_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

默认情况下,任务队列将 POST 请求发送到映射到 URL 的任何处理程序(在您的情况下是 /worker,它应该映射到 CounterWorker)。因此,您需要在 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 回答