Fibres de noeud et rappels asynchrones

par Neil lobo, ingénieur logiciel

Une partie de la popularité de node. js est la boucle d'événements. Plutôt que de prendre l'approche multithread des frameworks traditionnels, node. js utilise un modèle d'e/S non bloquant et piloté par des événements. Cela lui donne une empreinte de mémoire plus légère, est plus léger et efficace, et s'adapte bien pour les applications en temps réel intensives de données.

Cette approche non bloquant pilotée par l'événement fonctionne bien pour les applications où le goulot d'étranglement est l'activité d'e/S ou de réseau. En revanche, si l'application nécessite des tâches gourmandes en UC, node. js est probablement un mauvais choix.

Cependant, le travail avec le noeud. js nu exige l'utilisation des rappels asynchrones qui conduisent à l'enfer infâme de rappel. Cela conduit à la logique qui est difficile à suivre

//Callback Soup/Spiral Callback of Doom
function doAsync1(function () {
    doAsync2(function () {
      doAsync3(function () {
        doAsync4(function () {
          //finally do something });
        });
      });
  });

La gestion des erreurs et les rappels imbriqués sont inconfortables à écrire, et leur existence rend le code difficile à maintenir et à mettre à l'échelle. Il existe quelques techniques pour surmonter ces problèmes, les plus populaires étant les fibres et les promesses.  Je veux discuter de l'ancien comme Meteor utilise des fibres pour atteindre synchrone comme le code sur la boucle d'événement.

Fibres

Pour ceux qui ne sont pas familiers avec elle, les fibres est une construction informatique qui utilisent un modèle de coopération multitâche (à la différence des threads utilisent la préemption multitâche)

Le code fileté peut être interrompu à tout moment, même au milieu de l'évaluation d'une expression, pour donner des cycles CPU au code en cours d'exécution dans un autre thread. Avec les fibres, ces interruptions et les commutateurs de contexte ne sont pas déterminés par le CPU ou un processus de niveau inférieur; ils sont déterminés par le programmeur qui décide où son code va céder et donner des cycles CPU à d'autres fibres.

Voici un exemple de code node. js typique qui utilise un callbackFunction qui est passé le résultat.

getDataFromDisk = function(fileName, key, callbackFunction) { 
résultat var;
fs.readFile('/path/fileName', function(err, res) { if (err) console.log(err); else { result = transform(res, key); callbackFunction(result); }}};

Permet de viser à écrire est dans un style plus synchrone

getDataFromDisk = function(fileName, key) {
  var result;
  fs.readFile('/path/fileName', function(err, res) {
    if (err) console.log(err);    else result = transform(res, key); 
} return result;// sera toujours indéfini } ; // Nous essayons d'utiliser getDataFromDisk pour retourner la valeur, alors // Imprimez le tout de façon synchrone. var result = getDataFromDisk('helloWorld',key) ; console.log(résultat) ; indéfini // indéfini

Le code ci-dessus retournera toujours non défini, car la boucle d'événements se déplace sur la ligne de résultat de retour (*) sans attendre le résultat du rappel.

Utilisation des fibres

Les fibres sont une classe de fonctions de conteneur qui peut être utilisée pour bloquer une sous-routine en attendant sur certaines e/S ou l'activité du réseau sans bloquer l'ensemble du processus.

var Fiber = Npm.require('fibers');// getDataFromDisk function using Fibers
getDataFromDisk = function(filename, key) {var fiber = Fiber.current; //get the current Fiber
fs.readFile('/path/fileName', function(err, res) {
if (err) console.log(err); else{
/* Resume execution of this fiber. What’s passed to fiber.run will become the value returned by Fiber.yield below */
fiber.run( transform(res, key) );
var result = Fiber.yield();
return result;};
// Finally we wrap our code in a Fiber, then run it
Fiber(function() { 
var result = getDataFromDisk('helloWorld', clé) ; console.log(résultat) ; }).run() ;

Presto, nous avons le code prospectif synchrone qui est toujours exécuté de façon asynchrone sur la boucle d'événement.

Pour plus de détails sur les fibres Check out (https://github.com/laverdet/node-fibers)

À propos de ShareThis

Depuis 2007,ShareThis libère la puissance du comportement numérique mondial en synthétisant les données relatives aux partages sociaux, aux intérêts et aux intentions. Grâce au comportement des consommateurs sur plus de trois millions de domaines mondiaux, ShareThis observe les actions en temps réel de personnes réelles sur des destinations numériques réelles.

S'abonner à notre newsletter

Recevez les dernières nouvelles, les conseils et les mises à jour

S'abonner

Contenu connexe