如何理解龙卷风协同程序生成

2024-09-30 00:40:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我只是龙卷风的新手,但不是Python。在

我正在尝试为CouchDB编写一个异步客户机(使用CouchDB包)。

经过一天的研究/谷歌搜索,我发现每个帖子都只是简单地使用httpasinclient,而没有说明原因和方式通用协同程序有效。 源代码对我来说太复杂了,因为decorator-after-decorator-httpasynclient对我来说是个很糟糕的例子。。。在


Tags: 客户机源代码方式原因decorator帖子例子couchdb
2条回答

坦白地说,对马来说,只有在读了《源》之后,我才(部分地)理解了其中的逻辑

如果你用tornado.gen装饰somefunction(),它的工作原理是这样的:

  1. 在语句yield somefunction()中,实际调用了somefunction()
  2. 因为它是一个包装器,所以执行的不是您的代码而是tornado.coroutine.gen。它运行您的代码,直到somefunction中的第一个yield
  3. 如果一个Future(placehodler)被产生(回到decorator代码!),tornado说:“好吧,当这个未来解决时,为IOLoop安排一个任务(IOLoop回调),以便它调用一些another_callback()”。在
  4. 为了跟踪您的somefunction()的执行过程,Tornado维护了一个名为Runner的特殊对象。它记住最后一条yield语句,该语句阻止了somefunction()的执行,并在执行装饰器gen时首次运行。在
  5. 在第3点之后,Future被“注册”,这个运行器从它的主run()方法返回,decorator退出,返回自己的Future
  6. 当未来从第三点开始。准备就绪后,它向IOLoop添加一个任务,IOLoop随后调用another_callback。后者是Tornado创建的一个特殊回调,简单地说,它与在第3点运行时运行的相同。一个新解决的未来产生了。在
  7. Runner使用.send()方法将一个新解析的Future值注入到somefuncion中,这会导致ait被分配给函数in语句中的一个变量(如果有):

    a = yield some_other_coroutine_for_example_async_client_fetch()
    

好吧,这是一个要点,这里有很多细节,其中一些我无法完全理解,尤其是异常处理,但是

第一个答案涵盖了很多。我只想让你知道一个更简单的抽象。 @通用协同程序在

res = yield foo()

协同程序的思想是异步执行foo(),特别是当foo需要大量IO或网络作业时。 这个收益可以触发foo()执行,并将控制权转移给调用者。它让运行者将这个foo()任务注册为未来的obj。然后当foo()成功返回一个结果时,这是神奇的发生,运行程序将以yield语句执行结果的形式将结果发送回来(告诉值yield和yield语句执行结果之间的差异)。在

相关问题 更多 >

    热门问题