如何理解AppEngine上ndb.tasklet?(how to understand appen

2019-08-19 09:15发布

从文档 :

一个NDB tasklt被一段代码可能与其它代码同时运行。 如果你写了一个微进程,应用程序可以像它采用异步NDB功能多使用它:它调用微进程,它返回一个未来; 后来,呼吁未来的get_result()方法得到结果。

在文档中的说明和例子非常喜欢魔术我。 我可以使用它,但感觉很难正确地理解它。

例如:

  1. 我可以把任何类型的代码的函数里面,装饰它作为ndb.tasklet? 然后用它作为异步功能后。 或者它必须AppEngine上的RPC?
  2. 请问这种装饰的也工作在我的电脑上?
  3. 它是一样的tasklet的pypy

Answer 1:

如果你看一下在未来的实现,它非常可比什么发电机是蟒蛇。 事实上,它使用相同的yield关键字来实现它说什么它。 阅读关于tasklets.py介绍意见作出一些澄清。

当您使用@tasklet装饰,它创建了一个未来等待在包装的函数的值。 如果该值是发电机,它增加了未来事件循环。 当你yield一个未来,事件循环贯穿所有排队的期货,直到你想要的未来已准备就绪。 这里的并发是每个未来将执行其代码,直到它返回(使用raise ndb.Return(...)或函数完成),抛出一个异常,或yield再次使用。 我想从技术上说,你可以用yield的代码只是停止执行该函数,而让事件循环继续运行其他期货,但我会认为这将帮助不大,除非你真的心里有一个巧妙的用例。

要回答你的问题:

  1. 技术上是可以的,但它不会异步运行。 当您装饰非收益函数@tasklet,其未来的价值计算,当你调用该函数设置。 也就是说,当你调用它,它贯穿了整个功能。 如果你想实现异步操作,则必须yield的东西,做异步工作。 一般在GAE将其工作方式,以RPC调用。

  2. 如果您的电脑上工作,你的意思是不开发应用程序服务器执行任务蕾/期货GAE一样,那么是的,虽然这是与devappserver2(现在在新的SDK默认值)更准确。 实际上,我不是100%肯定,如果本地RPC调用将并行使用期货时运行,但有一个事件循环通过期货是否去当地或生产。 如果你想使用未来的在其它非GAE代码,那么我认为你会使用会更好的Python 3.2内置的未来 (或找到一个在这里反向移植 )

  3. 样的,它不是一个真正的简单比较。 看看这里的文档 。 我们的想法是有些相同的(调度器可以与该事件循环),但低级实现大大不同。



文章来源: how to understand appengine ndb.tasklet?