Я надеюсь получить некоторые разъяснения о лучшем способе обработки «первого» * 1001 * deferreds , т. Е. Не просто добавлении обратных вызовов и ошибок в существующие методы Twisted, которые возвращают отложенный, но лучший способ созданияэти original deferreds.
В качестве конкретного примера, здесь представлены 2 варианта одного и того же метода: он просто подсчитывает количество строк в некоторых довольно больших текстовых файлах и используется как начальная точка для цепочки отсрочек.
Метод 1: Этот вариант не очень хорош, так как отсрочка запускается непосредственно методом реактором.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
Метод 2: немного лучше, так как отсроченный фактически срабатывает , когда результат доступен
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 оченьмедленно (считая строки в некоторых огромных файлах и т. д.), может ли оно «заблокировать» все приложение Twisted?Я прочитал довольно много документации о том, как обратные вызовы и ошибочные действия и реактор ведут себя вместе (обратные вызовы должны выполняться быстро или возвращать отложенные ответы и т. Д.), Но в этом случае я просто не вижу и буду очень признателен за некоторые указатели /примеры и т. д.
Существуют ли какие-нибудь статьи / понятные пояснения, касающиеся наилучшего подхода к созданию этих «первых» отсрочек?Я прочитал эти прекрасные статьи , и они очень помогли с некоторым базовым пониманием, но я все еще чувствую, что мне не хватает части.
Для кода блокировки , будет ли это типичным случаем для DeferToThread или реактор. Spawnprocess ?Я прочитал много вопросов, таких как , этот и , эта статья , но я все еще не уверен на 100%, как бороться с потенциально блокирующим кодом, в основном при работе с файлом i /o
Извините, если что-то кажется слишком простым, но я действительно хочу научиться использовать Twisted более тщательно.(Это был действительно мощный инструмент для всех сетевых аспектов).Спасибо за ваше время!