2016-12-07 3 views
0

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

+0

Я считаю, вы можете использовать uv_async – immibis

ответ

0

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