【发布时间】:2012-01-14 23:57:15
【问题描述】:
我希望对处理“第一个”deferreds 的最佳方法进行一些澄清,即不仅向返回延迟的现有 Twisted 方法添加回调和 errbacks,而是最好的方法创建那些原始延迟。
作为一个具体的例子,这里有两种相同方法的变体: 它只是计算一些相当大的文本文件中的行数,并用作延迟链的起点。
方法一: 这个感觉不太好,因为 deferred 是由 reactor.callLater 方法直接触发的。
def get_line_count(self):
deferred = defer.Deferred()
def count_lines(result):
try:
print_file = file(self.print_file_path, "r")
self.line_count = sum(1 for line in print_file)
print_file.close()
return self.line_count
except Exception as inst:
raise InvalidFile()
deferred.addCallback(count_lines)
reactor.callLater(1, deferred.callback, None)
return deferred
方法二: 稍微好一点,因为延迟实际上是在当结果可用时触发
def get_line_count(self):
deferred = defer.Deferred()
def count_lines():
try:
print_file = file(self.print_file_path, "r")
self.line_count = sum(1 for line in print_file)
print_file.close()
deferred.callback(self.line_count)
except Exception as inst:
deferred.errback(InvalidFile())
reactor.callLater(1, count_lines)
return deferred
注意:您还可以指出,这两种方法实际上都是同步的,并且可能是阻塞方法(我也许可以使用“MaybeDeferred”?)。 但是,这实际上是我感到困惑的方面之一。
对于方法 2,如果 count_lines 方法非常慢(计算一些大文件中的行数等),它是否可能会“阻塞”整个扭曲的应用程序? 我阅读了很多关于回调和 errbacks 以及反应器如何一起工作的文档(回调需要快速执行,或者自己返回延迟等),但在这种情况下,我只是没有看到并且真的很感激一些指针/示例等
是否有一些文章/明确解释处理创建这些“第一”延迟的最佳方法?我已经通读了these excellent articles,他们对一些基本的理解有很大帮助,但我仍然觉得我缺少一部分。
对于阻塞代码,这是 DeferToThread 或 reactor.spawnprocess 的典型情况吗? 我阅读了很多问题,例如 this one 和 this article,但我仍然不能 100% 确定如何处理潜在的阻塞代码,主要是在处理文件 i/o 时
对不起,如果这看起来太基本了,但我真的想更彻底地掌握使用 Twisted 的窍门。 (对于所有更多面向网络的方面来说,它都是一个非常强大的工具)。 感谢您的宝贵时间!
【问题讨论】: