Twisted如何知道函数应该以异步方式执行?
异步函数应该返回一个延迟(即时)附加的call- / errbacks,当收到“异步”数据时将调用它。接收的数据作为第一个arg传递给回调。到现在为止还挺好。但根据Docs:
“延迟不是一个非阻塞的护身符:它们是用于将结果传递给回调的异步函数的信号......”。
如果我在返回Deferred之前执行耗时的操作,则该功能会阻塞!?异步执行是否绑定到socket / io操作?有人可以为Twisted noob解释这个吗?
由于
[对不起,如果这是一个愚蠢的问题,但我尝试开始使用Twisted,我想了解幕后发生了什么。在我发布问题之前,我试图了解文档。]
答案 0 :(得分:3)
Krondo.com有一个Twisted tutorial,这是学习Twisted的最佳方式。关于Deferred类的问题的答案是通过优秀的工作代码示例给出的。初学者和高级主题的解释非常好并且符合逻辑顺序。
答案 1 :(得分:2)
函数在Twisted中不是异步的,除非您在具有reactor.callInThread
的线程中执行它们。只有通过reactor的I / O操作是异步的。 (您可以将对线程的调用视为I / O;并且deferToThread
将返回在线程中运行的函数完成时完成的Deferred
。)
您需要区分两种截然不同的“耗时操作”。一个消耗CPU时间。在这种情况下,Twisted不会让你同时出现;计算密集型操作将阻止其他代码运行。您可以将它放在一个线程中(假设它本身不使用Twisted API),或者您可以使用spawnProcess
将其移动到另一个进程。
然而,耗时的网络请求/响应表现为调用数据(有效地立即完成)以及稍后在收到响应时再调用返回。这不会阻止Twisted执行其他代码,因为它返回主循环。这是Deferrred
封装的回调。