【问题标题】:appengine runs failed tasks twice even if task_retry_limit=0即使 task_retry_limit=0,appengine 也会运行两次失败的任务
【发布时间】:2014-10-30 15:52:47
【问题描述】:

我在任务队列 API 中看到了错误行为。当任务失败时,appengine 总是会再次运行它,即使我告诉它不要这样做。

这是相关代码:

NO_RETRY = TaskRetryOptions(task_retry_limit=0)


class EnqueueTaskDapau(webapp2.RequestHandler):
    def get(self):
        taskqueue.add(
            url='/task_dapau',
            queue_name='DEFAULT',
            retry_options=NO_RETRY
        )


class TaskDapau(webapp2.RequestHandler):
    def get(self):
        logging.warning('Vai dar pau')
        raise BaseException('Deu pau :-)')

    def post(self):
        return self.get()


application = webapp2.WSGIApplication([
    ('/', MainPage),
    ('/enqueue_dapau', EnqueueTaskDapau),
    ('/task_dapau', TaskDapau),
], debug=True)

整个应用程序是available on Github,所以它应该很容易复制。 当我将浏览器指向 /enqueue_dapau 时,这就是我在日志中看到的内容(在 Web 控制台上):

2014-10-30 08:31:01.054 /task_dapau 500 4ms 0kb AppEngine-Google; (+http://code.google.com/appengine) module=default version=1
W 2014-10-30 08:31:01.052 Vai dar pau
E 2014-10-30 08:31:01.053 Traceback (most recent call last): File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 267, in

2014-10-30 08:31:00.933 /task_dapau 500 3ms 0kb AppEngine-Google; (+http://code.google.com/appengine) module=default version=1
W 2014-10-30 08:31:00.931 Vai dar pau
E 2014-10-30 08:31:00.932 Traceback (most recent call last): File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 267, in

2014-10-30 08:31:00.897 /enqueue_dapau 200 91ms 0kb Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36 module=default version=1

如果我在 Web 控制台上查看任务队列,我会看到“在最后一分钟运行 == 2” 这种行为与我在本地使用 SDK 获得的行为不同:

INFO     2014-10-30 15:49:05,711 module.py:666] default: "GET /enqueue_dapau HTTP/1.1" 200 -
WARNING  2014-10-30 15:49:05,729 views.py:33] Vai dar pau
ERROR    2014-10-30 15:49:05,729 wsgi.py:279] 
Traceback (most recent call last):
  File "/home/tony/google_appengine/google/appengine/runtime/wsgi.py", line 267, in Handle
    result = handler(dict(self._environ), self._StartResponse)
  File "/home/tony/google_appengine/lib/webapp2-2.3/webapp2.py", line 1505, in __call__
    rv = self.router.dispatch(request, response)
  File "/home/tony/google_appengine/lib/webapp2-2.3/webapp2.py", line 1253, in default_dispatcher
    return route.handler_adapter(request, response)
  File "/home/tony/google_appengine/lib/webapp2-2.3/webapp2.py", line 1077, in __call__
    return handler.dispatch()
  File "/home/tony/google_appengine/lib/webapp2-2.3/webapp2.py", line 545, in dispatch
    return method(*args, **kwargs)
  File "/home/tony/work/qmag/gaetests/src/views.py", line 37, in post
    return self.get()
  File "/home/tony/work/qmag/gaetests/src/views.py", line 34, in get
    raise BaseException('Deu pau :-)')
BaseException: Deu pau :-)
INFO     2014-10-30 15:49:05,735 module.py:666] default: "POST /task_dapau HTTP/1.1" 500 -
WARNING  2014-10-30 15:49:05,735 taskqueue_stub.py:1986] Task task4 failed to execute. The task has no remaining retries. Failing permanently after 0 retries and 0 seconds

这是一个错误吗? (真的是这样)

有没有简单的解决方法?

【问题讨论】:

标签: python google-app-engine task-queue


【解决方案1】:

作为mentioned in the documentation,App Engine 有时会运行一个任务两次。您应该编写任务以确保这不会有害。

【讨论】:

  • 天哪,谢谢!他们应该提到这个非常接近他们说'task_retry_limit'应该做什么>:|
【解决方案2】:

我刚刚找到了避免不必要的重试的方法:

taskqueue.add(
    url='/blah',
    queue_name='myq',
    retry_options=TaskRetryOptions(task_retry_limit=0, task_age_limit=1),
    countdown=1,
)

这种 retry_limit、age_limit 和 countdown 的组合是可以达到目的的神奇咒语。

虽然它仍然不是最理想的,所以在谷歌修复这个错误之前,我会留下这个没有绿色答案的答案。

【讨论】:

    【解决方案3】:

    检查您的 queue.yaml 文件并确保其配置正确。

    queue:
    - name: default
      retry_parameters:
        task_retry_limit: 0
    

    【讨论】:

      猜你喜欢
      • 2014-07-30
      • 2015-06-04
      • 1970-01-01
      • 2014-09-07
      • 2012-09-13
      • 2022-08-03
      • 2013-11-19
      • 1970-01-01
      • 2021-09-06
      相关资源
      最近更新 更多