Webworker-threads dans NodeJS

Je suis un débutant de NodeJS du monde C # qui essaie toujours de comprendre le labyrinthe complexe de JavaScript. J’essaie d’implémenter le multi-threading à partir de l’exemple sur https://www.npmjs.com/package/webworker-threads .

Je ne peux pas comprendre pourquoi le travail ci-dessous fonctionne:

var Worker = require('webworker-threads').Worker; var FibCalculator = require('./FibCalculator.js'); require('http').createServer(function (req,res) { console.log('request received.'); var fibo = new Worker(function() { var calcFib = function (n) { return n > 1 ? calcFib(n - 1) + calcFib(n - 2) : 1; }; this.onmessage = function (event) { postMessage(calcFib(event.data)); }; }); fibo.onmessage = function (event) { var msg = 'fib(5) = ' + event.data; console.log(msg); res.end(msg); }; fibo.postMessage(5); }).listen(3000); 

Mais le dessous ne veut tout simplement pas

 var Worker = require('webworker-threads').Worker; var FibCalculator = require('./FibCalculator.js'); //the below function just does not get called var calcFib = function (n) { console.log('***This will not print. Can someone explain why?***'); return n > 1 ? calcFib(n - 1) + calcFib(n - 2) : 1; }; require('http').createServer(function (req,res) { console.log('request received.'); var fibo = new Worker(function() { this.onmessage = function (event) { postMessage(calcFib(event.data)); }; }); fibo.onmessage = function (event) { var msg = 'fib(5) = ' + event.data; console.log(msg); res.end(msg); }; fibo.postMessage(5); }).listen(3000); 

Pourquoi est-ce que si je supprime la scope de calcFib, il ne peut pas être appelé? Mon idée était d’implémenter un wrapper sur des threads webworker pouvant être utilisé pour effectuer des opérations insortingnsèques de la CPU sur un autre thread. Cependant, je ne suis même pas capable d’appeler une fonction externe

Ci-dessous la réponse à la réponse de Benjamin Gruenbaum:

Comment puis-je appeler console.log dans onmessage mais pas ma fonction définie en dehors de la scope dans le même fichier?

 this.onmessage = function (event) { console.log('can call console.log even if it is external'); //cannot call calcFib(event.data) if it is defined outside the scope. postMessage(calcFib(event.data)); }; 

Les travailleurs travaillent en copiant le code afin de perdre toutes les données de fermeture. Vous ne pouvez pas accéder à la scope de la fermeture depuis le calcFib aussi calcFib n’est pas défini.

Vous devez définir calcFib dans le code de l’ calcFib ou l’envoyer via un message et l’ eval .

 var Worker = require('webworker-threads').Worker; var FibCalculator = require('./FibCalculator.js'); require('http').createServer(function (req,res) { console.log('request received.'); var fibo = new Worker(function() { //the below function just does not get called var calcFib = function (n) { console.log('***This will not print. Can someone explain why?***'); return n > 1 ? calcFib(n - 1) + calcFib(n - 2) : 1; }; this.onmessage = function (event) { postMessage(calcFib(event.data)); }; }); fibo.onmessage = function (event) { var msg = 'fib(5) = ' + event.data; console.log(msg); res.end(msg); }; fibo.postMessage(5); }).listen(3000); 

Je suis un collaborateur du projet node-webworker-threads .

Pourquoi votre code ne fonctionne pas

node-webworker-threads opérateurs de node-webworker-threads doivent apprendre toutes les fonctionnalités qu’ils sont invités à exécuter. Ils existent dans un espace de noms séparé, ils ne peuvent donc pas voir les éléments présents dans le même fichier à moins que vous ne leur en parliez spécifiquement. Vous leur parlez des fonctions nécessaires à l’aide des API load et eval node-webworker-threads .

Que peuvent faire les utilisateurs de node-webworker-threads

node-webworker-threads peuvent effectuer des fonctionnalités JavaScript natives, telles que des tableaux et des objects, interagir avec JSON et des expressions régulières, etc. Ces travailleurs prennent également en charge certains composants intégrés spécifiques à Node.js, tels que console.log. C’est pourquoi vous pouvez appeler console.log (une fonction intégrée prise en charge), mais pas votre fonction (en dehors de l’espace de noms du travail). Comme indiqué ailleurs , dans certains cas, les implémentations des API intégrées de node-webworker-threads ne correspondent pas parfaitement.