Предположим, что мы получаем данные из TCP-сокета и обрабатываем его шаг за шагом, чтобы получить результат. Каждый шаг реализуется как функция, которая задает параметр из предыдущего и возвращает результат к следующему. Мы связываем все эти функции как цепочку обратного вызова и называем каждую из этих функций как f1f2 ... fn.Как разбить длинную цепочку обратного вызова в libuv
В этой цепочке обратного вызова нет блоков, и каждый обратный вызов работает довольно быстро. Тем не менее, время выполнения всей цепочки не является незначительным, поэтому запустить целую цепочку в одиночной итерации цикла не принимается.
Для просто приковать эти функции в одной цепи обратного вызова, она будет работать как:
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 существует отложенных() сделать такую задачу. Однако, в libuv, как это сделать?
Я считаю, вы можете использовать uv_async – immibis