Я надеюсь на некоторое разъяснение по наилучшему способу обработки «первого» отложенных, то есть не просто добавить обратные вызовы и ошибки к существующим витым методам, которые возвращают отложенный, но лучший способ от создания оригинал отложенные.Python Twisted Отложенные: требуется уточнение
В качестве конкретного примера, вот 2 вариации одного и того же метода: он просто подсчитывает количество строк в некоторых довольно больших текстовых файлов, а также используется в качестве отправной точки для цепи deferreds.
Метод 1: Это один не чувствует себя так хорошо, как отложенный обжигают непосредственно методом 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
Метод 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 приложение? Я прочитал довольно много документации о том, как обратные вызовы и ошибки и реактор ведут себя вместе (обратные вызовы должны выполняться быстро или возвращать отложенные сами и т. Д.), Но в этом случае я просто не вижу и действительно ценю некоторые указатели/примеры и т.д.
есть некоторые статьи/четких объяснения, которые имеют дело с наилучшим подходом к созданию этого «первое» deferreds? Я прочитал these excellent articles, и они очень помогли с некоторым из основных понятий, но я все еще чувствую, что мне не хватает части.
Для блокировки кода, это было бы это typicall случае DeferToThread или reactor.spawnprocess? Я прочитал много вопросов, как this one и this article, но я до сих пор не 100% уверен в том, как иметь дело с потенциально блокирующий код, в основном при работе с файлом ввода/вывода
К сожалению, если все это кажется слишком основным, но я действительно хочу, чтобы повесить использование Twisted более тщательно. (Это был действительно мощный инструмент для всех сетевых аспектов). Спасибо за ваше время!
Большое спасибо за быстрый и тщательный ответ, Мартин! 1. и 2. Хорошо, подход Thread/Threadpool * делает * смысл в этом случае. –
3. Я склонен относиться с осторожностью к потокам в Python из-за GIL, но обычно это ** должно ** быть в состоянии справиться с 3-мя потоками, использующими методы 'count_lines' примерно в одно и то же время, не запутывая событие Twisted (метод используется в небольших «задачах», которые затем отправляют данные из файлов на устройства через последовательный порт) –
Спасибо за информацию о выбранном модуле, похоже, «связан» с различными типами реакторов в Twisted. Я рассмотрю его более подробно! Для практического использования, к сожалению, он поддерживает только сокеты на платформах Windows (отсюда довольно странные ограничения, которые я имел при использовании скрученной последовательной поддержки в Windows). –