В обычной практике программирования вы бы сделали
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
готов.
НТН