Класс Python витой Reactor - PullRequest
       8

Класс Python витой Reactor

3 голосов
/ 12 марта 2010

Какое значение имеют декораторы

 @reactor.callWhenRunning,
 @results_deferred.addCallback
 @results_deferred.addErrback.

Также, что такое отложенные строки, например, в

 twisted.internet.utils.getProcessOutput()

возвращает отложенную строку, что именно здесь происходит?

Я новичок в твисте, поэтому это может быть очень простой вопрос, но чтение витой документации мне не сильно помогло

Ответы [ 3 ]

4 голосов
/ 13 марта 2010

В обычной практике программирования вы бы сделали

db = Database.connect()
result = db.getResult()
processResult(result)

Теперь, в зависимости от вашей базы данных и сети, эти 3 оператора могут занять от миллисекунды до нескольких секунд.

Мы все программировали таким образом уже десятилетия, и по большей части у нас все хорошо с «ожиданием».

Но наступает момент, когда ваша программа не может просто ждать результатов. Ты бы начал думать, ну и дела, я мог бы сделать много других вещей, пока я жду результата. Может быть, распечатать вывод или обработать функцию, или просто быстро проверить сокет и т. Д.

Введите Twisted и Deferred.

Вместо ожидания result в Twisted при вызове специальных методов вы получите Deferred. Вы добавите функцию обратного вызова к этому отложенному, что означает, вызовите эту функцию, когда у вас есть результат / ответ.

deferredResult = db.nonBlockingGetResult()
deferredResult.addCallback(processOutput)

Как только первый оператор выполняется, он возвращает «что-то» обратно. И это что-то Deferred. Там нет блокировки, там нет ожидания. И к этому Deferred вы добавляете обратный вызов processOutput, который вызывается, когда deferred 'срабатывает' - т.е. result готов.

НТН

3 голосов
/ 12 марта 2010

Отсроченное - это как обещание вернуть результат в будущем. Вы действительно должны прочитать документацию по отсрочке здесь и здесь . Кроме того, вы должны читать на Python декораторы в целом. Одно введение здесь .

Точнее говоря, когда вы вызываете getProcessOutput (), результат не совсем готов. Это может быть готово в одно мгновение или через час. Но вам, вероятно, все равно: когда он будет готов, вы, вероятно, захотите взять вывод и передать его функции. Таким образом, вместо возврата результата (который не будет готов сразу), getProcessOutput возвращает отложенный объект. Когда выходные данные наконец готовы, отложенный объект заметит и вызовет любую функцию обработки, которую вы предоставите, передавая фактические выходные данные процесса. Вы действительно должны прочитать об отсрочках, хотя.

1 голос
/ 13 марта 2010

Я не уверен насчет python, но это похоже на шаблон Active object и Futures. Фьючерс будет стандартным в следующей версии C ++. Если вы прочитаете Активный объект и Фьючерсы, вы получите представление

...