2024-09-30 00:40:29 发布
网友
我只是龙卷风的新手,但不是Python。在
我正在尝试为CouchDB编写一个异步客户机(使用CouchDB包)。
经过一天的研究/谷歌搜索,我发现每个帖子都只是简单地使用httpasinclient,而没有说明原因和方式通用协同程序有效。 源代码对我来说太复杂了,因为decorator-after-decorator-httpasynclient对我来说是个很糟糕的例子。。。在
坦白地说,对马来说,只有在读了《源》之后,我才(部分地)理解了其中的逻辑
如果你用tornado.gen装饰somefunction(),它的工作原理是这样的:
tornado.gen
somefunction()
yield somefunction()
tornado.coroutine.gen
somefunction
yield
another_callback()
Runner
gen
run()
another_callback
Runner使用.send()方法将一个新解析的Future值注入到somefuncion中,这会导致ait被分配给函数in语句中的一个变量(如果有):
.send()
somefuncion
a = yield some_other_coroutine_for_example_async_client_fetch()
好吧,这是一个要点,这里有很多细节,其中一些我无法完全理解,尤其是异常处理,但是
第一个答案涵盖了很多。我只想让你知道一个更简单的抽象。 @通用协同程序在
res = yield foo()
协同程序的思想是异步执行foo(),特别是当foo需要大量IO或网络作业时。 这个收益可以触发foo()执行,并将控制权转移给调用者。它让运行者将这个foo()任务注册为未来的obj。然后当foo()成功返回一个结果时,这是神奇的发生,运行程序将以yield语句执行结果的形式将结果发送回来(告诉值yield和yield语句执行结果之间的差异)。在
foo()
坦白地说,对马来说,只有在读了《源》之后,我才(部分地)理解了其中的逻辑
如果你用
tornado.gen
装饰somefunction()
,它的工作原理是这样的:yield somefunction()
中,实际调用了somefunction()tornado.coroutine.gen
。它运行您的代码,直到somefunction
中的第一个yield
another_callback()
”。在somefunction()
的执行过程,Tornado维护了一个名为Runner
的特殊对象。它记住最后一条yield
语句,该语句阻止了somefunction()
的执行,并在执行装饰器gen
时首次运行。在run()
方法返回,decorator退出,返回自己的Futureanother_callback
。后者是Tornado创建的一个特殊回调,简单地说,它与在第3点运行时运行的相同。一个新解决的未来产生了。在Runner使用
.send()
方法将一个新解析的Future值注入到somefuncion
中,这会导致ait被分配给函数in语句中的一个变量(如果有):好吧,这是一个要点,这里有很多细节,其中一些我无法完全理解,尤其是异常处理,但是
第一个答案涵盖了很多。我只想让你知道一个更简单的抽象。 @通用协同程序在
协同程序的思想是异步执行
foo()
,特别是当foo需要大量IO或网络作业时。 这个收益可以触发foo()
执行,并将控制权转移给调用者。它让运行者将这个foo()
任务注册为未来的obj。然后当foo()
成功返回一个结果时,这是神奇的发生,运行程序将以yield语句执行结果的形式将结果发送回来(告诉值yield和yield语句执行结果之间的差异)。在相关问题 更多 >
编程相关推荐