Google App Engine deferred.defer() 方法返回时失败

3 投票
2 回答
1368 浏览
提问于 2025-04-16 11:24

我正在尝试使用 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。

2 个回答

2

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

deferred.defer(meeple_tasks.buildGames)

这里的“obj must be callable”意思是(在你的情况下)值 True 不能被调用。我的意思是,我用“defer”来写这个延迟调用,把 buildGames 方法的调用放到另一个进程(或者任务)里,插入到一个队列中,让 AppEngine 框架来处理它。

需要注意的是,你不能通过延迟任务返回任何东西。它们会在一个不同的进程中运行,可能还在完全不同的服务器上。根据文档,它们被称为后台工作者。

10

你应该使用:

result = deferred.defer(meeple_tasks.buildGames)

如果你使用 buildGames(),这会立即调用这个函数,并把它的结果传给 defer()。而如果你去掉括号,就只是把这个函数本身传给 defer(),而不是它的结果。

撰写回答