Node.js et Mutexes

Je me demande si des mutex / serrures sont nécessaires pour l'accès aux données dans Node.js. Par exemple, disons que j'ai créé un serveur simple. Le serveur fournit quelques méthodes de protocole à ajouter et à supprimer à partir d'un tableau interne. Dois-je protéger le réseau interne avec un certain type de mutex?

Je comprends que Javascript (et donc Node.js) est un seul thread. Je ne suis tout simplement pas clair sur la façon dont les événements sont gérés. Les événements sont-ils interrompus? Si tel est le cas, mon application pourrait être en train de lire le tableau, être interrompue pour exécuter un rappel d'événement qui modifie le tableau, puis continuer à traiter le tableau qui a été modifié par le rappel d'événement.

Je me demande si des mutex / serrures sont nécessaires pour l'accès aux données dans Node.js.

Nan! Les événements sont traités au moment où il n'y a pas d'autre code à exécuter, cela signifie qu'il n'y aura pas de contestation, car seul le code en cours d'exécution a accès à ce tableau interne. Comme un effet secondaire du noeud est simple, les calculs longs bloqueront tous les autres événements jusqu'à ce que le calcul soit terminé.

Je comprends que Javascript (et donc Node.js) est un seul thread. Je ne suis tout simplement pas clair sur la façon dont les événements sont gérés. Les événements sont-ils interrompus?

Non, les événements ne sont pas interrompus. Par exemple, si vous mettez un while(true){} dans votre code, cela empêcherait tout autre code d'être exécuté, car il y a toujours une autre itération de la boucle à exécuter.

Si vous avez un calcul long, il est judicieux d'utiliser process.nextTick , car cela permettra de l'exécuter lorsque rien d'autre n'est en cours d'exécution (je suis flou sur ceci: l'exemple ci-dessous montre que je suis probablement À propos de ça, sans interruption, probablement).

Si vous avez d'autres questions, n'hésitez pas à passer à # node.js et à poser des questions. En outre, j'ai demandé à quelques personnes de regarder cela et de m'assurer que je ne me trompe pas totalement;)

 var count = 0; var numIterations = 100; while(numIterations--) { process.nextTick(function() { count = count + 1; }); } setTimeout(function() { console.log(count); }, 2); // //=> 100 // 

Merci à AAA_awright de # node.js 🙂

Les verrouillages et les mutex sont en effet nécessaires parfois, même si Node.js est simple.

Supposons que vous ayez deux fichiers qui doivent avoir le même contenu et que le même contenu ne soit pas considéré comme un état incohérent. Supposons maintenant que vous devez les modifier sans bloquer le serveur. Si tu fais ça:

 fs.writeFile('file1', 'content', function (error) { if (error) { // ... } else { fs.writeFile('file2', 'content', function (error) { if (error) { // ... } else { // ready to continue } }); } }); 

Vous tombez dans un état incohérent entre les deux appels, alors qu'une autre fonction du même script peut lire les deux fichiers.

Le module rwlock est parfait pour traiter ces cas.

Je cherchais une solution pour les mutex de nœud. Mutexes sont parfois nécessaires – vous pourriez exécuter plusieurs instances de votre application de noeud et vous voudrez peut-être vous assurer que seule une d'entre elles fait quelque chose en particulier. Toutes les solutions que je pourrais trouver ne sont pas en cours de traitement ou en fonction de redis.

J'ai donc fait ma propre solution en utilisant les verrous de fichiers: https://github.com/Perennials/mutex-node