首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何理解应用程序ndb.tasklet?

如何理解应用程序ndb.tasklet?
EN

Stack Overflow用户
提问于 2013-04-04 02:27:35
回答 1查看 2.9K关注 0票数 7

来自文档

NDB任务线程是一段可以与其他代码同时运行的代码。如果您编写了一个tasklet,您的应用程序就可以使用它,就像它使用一个异步NDB函数一样:它调用tasklet,它返回一个未来;稍后,调用未来的get_result()方法得到结果。

这份文件中的解释和例子对我来说真的很神奇。我可以使用它,但很难正确理解它。

例如:

  1. 我可以在函数中放入任何代码并将其装饰为ndb.tasklet吗?然后将其用作异步函数。还是一定是应用程序RPC?
  2. 这种装潢师也能在我的电脑上工作吗?
  3. 它和pypy的微线程一样吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-06 18:32:49

如果您查看未来的实现,它非常类似于python中的生成器。实际上,它使用相同的yield关键字来实现它所说的功能。请阅读关于tasklets.py的简介以获得一些澄清。

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

回答你的问题:

  1. 从技术上讲是的,但是它不会异步运行。当您用@tasklet装饰一个非屈服函数时,它的未来值是在调用该函数时计算和设置的。也就是说,当您调用它时,它会贯穿整个函数。如果要实现异步操作,则必须对执行异步工作的内容进行yield。通常,在GAE中,它会一直工作到RPC调用。
  2. 如果在您的PC上工作,您的意思是开发应用服务器是否像GAE一样实现tasklet/期货,那么是的,尽管这在devappserver2 (现在是新的SDK中的默认设置)中更准确。实际上,我不能100%确定本地RPC调用是否会在使用期货时并行运行,但是在期货中有一个事件循环,不管是在本地还是在生产过程中。如果您想在您的其他非GAE代码中使用未来的代码,那么我认为您最好使用Python3.2的内置版本 (或者找到一个这里的后端)
  3. 这并不是一个简单的比较。看看这里的文件。这个想法有点相同(调度器可以与事件循环相比较),但是低级别的实现有很大的不同。
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15801523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档