2

Twisted如何知道函数应该以异步方式执行?

异步函数应该返回一个 Deferred(立即),并附加调用/errbacks,当接收到“异步”数据时将调用该函数。接收到的数据作为第一个参数传递给回调。到现在为止还挺好。但根据文档

“延迟不是非阻塞的护身符:它们是异步函数用来将结果传递给回调的信号......”。

如果我在返回 Deferred 之前执行了一个耗时的操作,那么函数会阻塞!?异步执行是否绑定到套接字/io 操作?有人可以为 Twisted noob 解释一下吗?

谢谢

[对不起,如果这是一个愚蠢的问题,但我尝试开始使用 Twisted,我想了解引擎盖下发生了什么。在在这里发布问题之前,我已经尝试了解文档。]

4

2 回答 2

3

Krondo.com 有一个Twisted 教程,它无疑是学习 Twisted 的最佳方式。您关于 Deferred 类的问题的答案提供了出色的工作代码示例。初学者和高级主题的解释非常好,并按逻辑顺序进行。

于 2013-09-21T04:02:14.983 回答
2

函数在 Twisted 中不是异步的,除非你在线程中使用reactor.callInThread. 只有通过反应器的 I/O 操作是异步的。(您可以将线程调用视为 I/O;当线程中运行的函数完成时,deferToThread将返回完成的 a。)Deferred

您需要区分两种非常不同类型的“耗时操作”。一个消耗CPU时间。在这种情况下,Twisted 不会为您实现并发;计算密集型操作将阻止其他代码运行。您可以将它放在一个线程中(假设它本身不使用 Twisted API),也可以使用spawnProcess.

然而,耗时的网络请求/响应表现为调用写入数据(立即有效地完成)和稍后收到响应时的另一个回调。这不会阻止 Twisted 执行其他代码,因为它会返回到主循环。Deferrred封装的就是这个回调。

于 2013-05-22T17:44:48.923 回答