Autoriser une seule opération asynchrone à la fois

Je construis un site et une opération particulière déclenche l’exécution d’un long processus côté serveur. Cette opération ne peut pas être exécutée deux fois en même temps, je dois donc mettre en place une sorte de protection. Il ne peut pas non plus être synchrone, car le serveur doit continuer à répondre aux autres demandes pendant son exécution.

À cette fin, j’ai construit ce petit test de concept, utilisant sleep 5 comme substitut de mon processus de longue durée (nécessite une promesse expresse et enfant-process , s’exécute sur un système avec une commande de sleep mais remplace tout ce que vous avez pour Windows):

 var site = require("express")(); var exec = require("child-process-promise").exec; var busy = false; site.get("/test", function (req, res) { if (busy) { res.json({status:"busy"}); } else { busy = true; // <-- set busy before we start exec("sleep 5").then(function () { res.json({status:"ok"}); }).catch(function (err) { res.json({status:err.message}); }).then(function () { busy = false; // <-- finally: clear busy }); } }); site.listen(8082); 

L’intention de ceci est lorsque “/ test” est demandé, il déclenche une longue opération. Si “/ test” est à nouveau demandé alors qu’il est en cours d’exécution, il répond par “occupé” et ne fait rien.

Ma question est la suivante: cette implémentation est-elle sûre et correcte? Cela semble fonctionner dans mes tests superficiels, mais c’est étrangement simple. Est-ce la bonne façon d’implémenter essentiellement un mutex + une opération “try-lock”, ou existe-t-il une construction Node.js plus appropriée? Venant de langages où je suis habitué aux pratiques standard de multithreading, je ne suis pas encore à l’ aise avec la nature mono-thread-asynchrone de Node.

Tout va bien. Le code Javascript ne peut pas être exécuté simultanément avec d’autres codes JS dans Node. Rien ne changera le drapeau occupé sous vos pieds. Pas besoin de moniteurs de style multithread ou de sections critiques.