Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何理解appengine ndb.tasklet?_Python_Google App Engine_Tasklet - Fatal编程技术网

Python 如何理解appengine ndb.tasklet?

Python 如何理解appengine ndb.tasklet?,python,google-app-engine,tasklet,Python,Google App Engine,Tasklet,发件人: NDB tasklet是一段代码,可以与并发运行 其他代码。如果您编写了一个tasklet,那么您的应用程序可以大量使用它 就像它使用异步NDB函数一样:它调用tasklet 返回未来;稍后,调用Future的get_result()方法 结果呢 文档中的解释和示例对我来说真的很神奇。 我可以使用它,但我觉得很难正确理解它 例如: 我可以在函数中放入任何类型的代码并将其装饰为ndb.tasklet吗?之后将其用作异步函数。或者一定是appengine RPC 这种装饰也适用于我的电脑吗

发件人:

NDB tasklet是一段代码,可以与并发运行 其他代码。如果您编写了一个tasklet,那么您的应用程序可以大量使用它 就像它使用异步NDB函数一样:它调用tasklet 返回未来;稍后,调用Future的get_result()方法 结果呢

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

例如:

  • 我可以在函数中放入任何类型的代码并将其装饰为ndb.tasklet吗?之后将其用作异步函数。或者一定是appengine RPC
  • 这种装饰也适用于我的电脑吗
  • 和你的一样吗

  • 如果您看一看未来的实现,它与python中的生成器非常相似。事实上,它使用相同的
    yield
    关键字来实现它所说的功能。请阅读下面的说明

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

    回答您的问题:

  • 技术上是的,但它不会异步运行。当您用@tasklet修饰一个不屈服的函数时,它的未来值将在您调用该函数时计算和设置。也就是说,当您调用它时,它将贯穿整个函数。如果您想实现异步操作,您必须在异步工作的东西上
    yield
    。通常在GAE中,它会一直工作到RPC调用

  • 如果您所说的在PC上工作是指dev appserver是否实现了类似GAE的tasklets/Futures,那么是的,尽管devappserver2(现在是较新SDK中的默认版本)更准确。实际上,我不能100%确定在使用Futures时本地RPC调用是否会并行运行,但无论是在本地还是在生产中,Futures都会有一个eventloop。如果您想在其他非GAE代码中使用Future,那么我认为您最好使用(或找到一个)

  • 这不是一个简单的比较。看这张照片。这个想法有些相同(调度器可以与eventloop相比较),但底层实现有很大不同