【发布时间】:2018-03-09 11:40:55
【问题描述】:
我有一些钩子,我想我可以用@ndb.tasklet 装饰它们,以便在钩子中使用异步api。 例如
@classmethod
@ndb.tasklet
def _post_delete_hook(cls, key,future):
yield do_something_async()
这个似乎可以工作,但我时不时地看到这些钩子内的代码出现“暂停生成器”错误。
我应该改用@ndb.synctasklet 吗?
错误示例:
suspended generator _post_put_hook(data_field.py:112) raised TypeError(Expected Future, received <class 'google.appengine.api.apiproxy_stub_map.UserRPC'>: <google.appengine.api.apiproxy_stub_map.UserRPC object at 0x09AA00B0>)
偶尔导致错误的代码是:
t, d = yield (queue.add_async(task), queue.delete_tasks_async(taskqueue.Task(name=existing_task_name)))
现在我已经输入了@ndb.synctasklet,它引发了一个实际的异常。
【问题讨论】:
-
你能显示这样(完整的)暂停生成器错误吗?它们可能无关...
-
@DanCornilescu 谢谢,已更新。
-
我认为该消息可能表明在为异步操作创建
Future时遇到错误。您正试图在该收益率中一次创建 2 个期货 - 情况是否如此,或者有时可能只有其中一个?您可以添加检查以查看是否正确创建了每个未来吗?大部分时间都是在黑暗中拍摄,到目前为止,我并没有玩太多的小任务。 -
@DanCornilescu 谢谢。我现在将它们分成 2 个单独的产量(不理想)。我再也没有看到错误。我认为该错误是由 delete_tasks_async 引发的。不过,我的主要问题是将其装饰为 ndb.tasklet 或 ndb.synctasklet 是否正确。 ndb.tasklet 似乎将错误排除在外
-
我不建议使用 2 个
yield操作,只需将每个*_async调用分配给一个变量,检查变量并仅生成有效变量。
标签: python google-app-engine app-engine-ndb