gpt4 book ai didi

python - 如何理解appengine ndb.tasklet?

转载 作者:太空狗 更新时间:2023-10-29 21:24:38 28 4
gpt4 key购买 nike

来自 documentation :

An NDB tasklet is a piece of code that might run concurrently with other code. If you write a tasklet, your application can use it much like it uses an async NDB function: it calls the tasklet, which returns a Future; later, calling the Future's get_result() method gets the result.

文档中的解释和示例对我来说真的很神奇。我可以使用它,但感觉很难正确理解它。

例如:

  1. 我可以将任何类型的代码放入函数中并将其装饰为 ndb.tasklet 吗?然后稍后将其用作异步功能。还是必须是appengine RPC?
  2. 这种装饰器是否也适用于我的电脑?
  3. 是否与tasklet for pypy相同?

最佳答案

如果您查看 Future 的实现,它与 Python 中的生成器非常相似。事实上,它使用相同的 yield 关键字来实现它所说的功能。阅读 intro comments on the tasklets.py一些澄清。

当您使用@tasklet 装饰器时,它会创建一个 Future 并等待包装函数的值。如果该值是一个生成器,它会将 Future 添加到事件循环中。当您对 Future yield 时,事件循环会遍历所有排队的 Futures,直到您想要的 Future 准备就绪。这里的并发是每个 Future 将执行它的代码,直到它返回(使用 raise ndb.Return(...) 或函数完成),抛出异常,或 yield 再次使用。我想从技术上讲,你可以在代码中使用 yield 来停止执行该函数,让事件循环继续运行其他 Futures,但我认为这不会有太大帮助,除非你真的有一个聪明的用例。

回答您的问题:

  1. 技术上是的,但它不会异步运行。当你用@tasklet 修饰一个非生成函数时,它的 Future 值会在你调用该函数时计算和设置。也就是你调用它的时候,它贯穿了整个函数。如果你想实现异步操作,你必须在做异步工作的东西上yield。通常在 GAE 中,它会一直工作到 RPC 调用。

  2. 如果在您的 PC 上工作,您的意思是开发应用服务器是否像 GAE 一样实现了 tasklets/Futures,那么是的,尽管这对于 devappserver2(现在是较新的 SDK 中的默认设置)更准确。实际上,我不是 100% 确定本地 RPC 调用是否会在使用 Futures 时并行运行,但是无论是在本地还是在生产中,都会有一个事件循环通过 Futures。如果您想在其他非 GAE 代码中使用 Future,那么我认为您最好使用 Python 3.2's built-in future (或者找一个 backport here )

  3. 有点,这不是一个简单的比较。看documentation here .思路有些相同(调度器可以类比为事件循环),但底层实现却大相径庭。

关于python - 如何理解appengine ndb.tasklet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15801523/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com