从文档 :
一个NDB tasklt被一段代码可能与其它代码同时运行。 如果你写了一个微进程,应用程序可以像它采用异步NDB功能多使用它:它调用微进程,它返回一个未来; 后来,呼吁未来的get_result()方法得到结果。
在文档中的说明和例子非常喜欢魔术我。 我可以使用它,但感觉很难正确地理解它。
例如:
- 我可以把任何类型的代码的函数里面,装饰它作为ndb.tasklet? 然后用它作为异步功能后。 或者它必须AppEngine上的RPC?
- 请问这种装饰的也工作在我的电脑上?
- 它是一样的tasklet的pypy
如果你看一下在未来的实现,它非常可比什么发电机是蟒蛇。 事实上,它使用相同的yield
关键字来实现它说什么它。 阅读关于tasklets.py介绍意见作出一些澄清。
当您使用@tasklet装饰,它创建了一个未来等待在包装的函数的值。 如果该值是发电机,它增加了未来事件循环。 当你yield
一个未来,事件循环贯穿所有排队的期货,直到你想要的未来已准备就绪。 这里的并发是每个未来将执行其代码,直到它返回(使用raise ndb.Return(...)
或函数完成),抛出一个异常,或yield
再次使用。 我想从技术上说,你可以用yield
的代码只是停止执行该函数,而让事件循环继续运行其他期货,但我会认为这将帮助不大,除非你真的心里有一个巧妙的用例。
要回答你的问题:
技术上是可以的,但它不会异步运行。 当您装饰非收益函数@tasklet,其未来的价值计算,当你调用该函数设置。 也就是说,当你调用它,它贯穿了整个功能。 如果你想实现异步操作,则必须yield
的东西,做异步工作。 一般在GAE将其工作方式,以RPC调用。
如果您的电脑上工作,你的意思是不开发应用程序服务器执行任务蕾/期货GAE一样,那么是的,虽然这是与devappserver2(现在在新的SDK默认值)更准确。 实际上,我不是100%肯定,如果本地RPC调用将并行使用期货时运行,但有一个事件循环通过期货是否去当地或生产。 如果你想使用未来的在其它非GAE代码,那么我认为你会使用会更好的Python 3.2内置的未来 (或找到一个在这里反向移植 )
样的,它不是一个真正的简单比较。 看看这里的文档 。 我们的想法是有些相同的(调度器可以与该事件循环),但低级实现大大不同。