как разорвать длинную цепочку обратного вызова в libuv

Предположим, что мы получаем данные из 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 как это сделать?


person Douglas Su    schedule 07.12.2016    source источник
comment
Я считаю, что вы можете использовать uv_async   -  person user253751    schedule 07.12.2016


Ответы (1)


libuv не имеет встроенного API для этого. Однако у вас есть некоторые строительные блоки: вы можете создать какую-то структуру «цепочки», в которой вы запоминаете состояние, и запускаете ее в uv_idle_t. Обратите внимание, что дескрипторы бездействия предотвращают блокировку цикла для ввода-вывода, когда они активны.

person saghul    schedule 07.12.2016