Предположим, что мы получаем данные из TCP-сокета и обрабатываем их шаг за шагом, чтобы получить результат. Каждый шаг реализован как функция, которая задает параметр из предыдущего и возвращает результат следующему. Мы объединяем все эти функции в цепочку обратного вызова и называем каждую из этих функций как f1 f2 ... fn.
В этой цепочке обратных вызовов нет блочных функций, и каждый обратный вызов выполняется довольно быстро. Однако время выполнения всей цепочки нельзя пренебречь, поэтому выполнение всей цепочки в итерации с одним циклом недопустимо.
Если просто связать эти функции в одну цепочку обратного вызова, она будет работать как:
data -> f1 -> f2 -> f3 -> f4 -> f5 ->... -> fn -> result
|------- single loop iteration -------|
Хорошо разбить эту цепочку на множество разделов и запустить каждый раздел в одной итерации цикла. Это выглядит так:
data -> f1 -> f2 -> f3 -> f4 -> f5 ->... -> fn-1 -> fn -> result
| loop1 | |-- loop 2 --| |- loop m -|
Я знаю, что в Twisted существует функция deferred() для выполнения такой задачи. Однако в libuv как это сделать?