luc*_*mia 7 python google-app-engine tasklet
来自文档:
NDB tasklet是一段可能与其他代码并发运行的代码.如果你编写一个tasklet,你的应用程序可以像使用异步NDB函数一样使用它:它调用tasklet,它返回一个Future; 之后,调用Future的get_result()方法获取结果.
文档中的解释和示例对我来说真的很神奇.我可以使用它,但很难理解它.
例如:
som*_*ne1 15
如果你看一下Future的实现,它与python中的生成器非常相似.实际上,它使用相同的yield关键字来实现它所说的功能.阅读有关tasklets.py的介绍性评论,以获得一些说明.
当您使用@tasklet装饰器时,它会创建一个Future并等待包装函数的值.如果值是生成器,则将Future添加到事件循环中.当您yield使用Future时,事件循环将运行所有排队的Futures,直到您想要的Future准备就绪.这里的并发性是每个Future将执行其代码,直到它返回(使用raise ndb.Return(...)或函数完成),抛出异常或yield再次使用.我从技术上讲,你可以yield在代码中使用它来停止执行该函数,而不是让事件循环继续运行其他Futures,但我认为除非你真的有一个聪明的用例,否则这没什么用.
回答你的问题:
从技术上讲是,但它不会异步运行.使用@tasklet装饰非屈服函数时,会在调用该函数时计算并设置其Future的值.也就是说,当你调用它时,它会遍历整个函数.如果要实现异步操作,则必须执行异步操作yield.通常在GAE中,它将一直用于RPC调用.
如果在PC上工作,你的意思是dev appserver实现了像GAE那样的tasklets/Futures,那么是的,虽然这对devappserver2更准确(现在是新版SDK中的默认设置).我实际上并不是100%确定本地RPC调用是否会在使用Futures时并行运行,但是有一个eventloop通过Futures,无论是本地还是生产.如果你想在你的其他非GAE代码中使用Future,那么我认为你最好使用Python 3.2的内置未来(或在这里找到一个backport)
有点,它不是一个简单的比较.请查看此处的文档.这个想法有点相同(调度程序可以与eventloop进行比较),但是低级实现有很大不同.
| 归档时间: |
|
| 查看次数: |
2480 次 |
| 最近记录: |