【问题标题】:Google App Engine deferred.defer() failing when method returns方法返回时 Google App Engine deferred.defer() 失败
【发布时间】:2011-02-07 17:51:39
【问题描述】:

我正在尝试使用 google.appengine.ext.deferred 来运行任务。我将一个方法传递给 defer() 方法,该方法运行成功,但返回时,抛出一个 ValueError:

  File ".../admin.py", line 73, in post
    result = deferred.defer(meeple_tasks.buildGames())
      File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/deferred/deferred.py", line 198, in _curry_callable
        raise ValueError("obj must be callable")
    ValueError: obj must be callable

这里是我称之为 defer 的地方:

result = deferred.defer(meeple_tasks.buildGames())   

buildGames() 将在完成时返回 True。

【问题讨论】:

    标签: python google-app-engine exception task


    【解决方案1】:

    你应该使用:

    result = deferred.defer(meeple_tasks.buildGames)
    

    如果您使用buildGames(),则立即调用函数,将返回值传递给defer()。通过删除括号,您可以将函数本身传递给 defer。

    【讨论】:

      【解决方案2】:

      你需要像这样调用你的延迟任务:

      deferred.defer(meeple_tasks.buildGames)

      “obj 必须是可调用的”意味着(在您的情况下)值 True 是不可调用的。我如何通过将 buildGames 方法调用“延迟”到另一个进程(或任务)来编写延迟调用,方法是将其插入队列并让 AppEngine 框架处理它。

      请注意,您不能通过延迟任务返回任何内容。它们将在不同的进程上运行,并且可能在完全不同的服务器上运行。根据文档,他们是后台工作人员。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-19
        • 2014-05-12
        • 1970-01-01
        • 2018-07-24
        • 2013-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多