2016-12-07 25 views
0

Supposons que nous recevons données du socket TCP, et le traiter étape par étape pour obtenir le résultat . Chaque étape est implémentée comme une fonction qui charge le paramètre du précédent et renvoie le résultat au suivant. Nous enchaînons toutes ces fonctions en tant que chaîne de rappel et nommons chacune de ces fonctions f1f2 ... fn.comment rompre une longue chaîne de rappel dans libuv

Il n'y a pas de fonctions de bloc dans cette chaîne de rappel et chaque rappel s'exécute assez rapidement. Cependant, le temps d'exécution de la chaîne entière n'est pas négligeable, donc l'exécution de la chaîne entière en boucle unique n'est pas acceptée.

pour la chaîne simplement ces fonctions dans une chaîne de rappel, il fonctionnera:

data -> f1 -> f2 -> f3 -> f4 -> f5 ->... -> fn -> result 
     |------- single loop iteration -------| 

Il est bon de briser cette chaîne en plusieurs sections, et chaque section exécuter en une seule itération de la boucle. Cela ressemble à:

data -> f1 -> f2 -> f3 -> f4 -> f5 ->... -> fn-1 -> fn -> result 
     | loop1 | |-- loop 2 --|   |- loop m -| 

Je sais que dans Twisted, il existe un différé() faire une telle tâche. Cependant, en libuv, comment le faire?

+0

Je crois que vous pouvez utiliser uv_async – immibis

Répondre

0

libuv ne possède pas d'API intégrée pour ce faire. Vous avez cependant quelques briques: vous pouvez créer une sorte de structure en "chaîne" où vous vous souvenez de l'état, et l'exécuter dans un uv_idle_t. Notez que les handles inactifs empêchent la boucle de bloquer les E/S lorsqu'ils sont actifs.