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 .
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
.
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.