34 votes

JavaScript multithreading

Je travaille sur la comparaison de plusieurs méthodes différentes de mise en œuvre du multithreading (réel ou faux) en JavaScript. Pour autant que je sache, seuls webworkers et Google Gears WorkerPool peuvent vous donner de vrais threads (c'est-à-dire répartis sur plusieurs processeurs avec une véritable exécution parallèle). J'ai trouvé les méthodes suivantes :

  • passer d'une tâche à l'autre en utilisant yield()

  • utiliser setInterval() (ou toute autre fonction non bloquante) avec des threads qui attendent les uns les autres

  • utiliser les threads du WorkerPool de Google Gears (avec un plugin)

  • utiliser les travailleurs web html5

J'ai lu les questions connexes et j'ai trouvé plusieurs variations des méthodes ci-dessus, mais la plupart de ces questions sont anciennes, donc il pourrait y avoir quelques nouvelles idées.

Je me demande comment on peut réaliser le multithreading en JavaScript. D'autres méthodes importantes ?

UPDATE : Comme indiqué dans les commentaires, je voulais en fait parler de concurrence.

UPDATE 2 : J'ai trouvé des informations selon lesquelles Silverlight + JScript supporte le multithreading, mais je ne suis pas en mesure de le vérifier.

UPDATE 3 : Google a déprécié Gears : http://code.google.com/apis/gears/api_workerpool.html

29voto

Sidnicious Points 15187

Travailleurs du Web . Il s'agit d'une norme du W3C (ou plutôt d'un projet de travail pour l'instant) qui sert exactement à cela et ne nécessite aucun plugin :

Cette spécification définit une API qui permet aux auteurs d'applications Web d'engendrer des travailleurs d'arrière-plan exécutant des scripts en parallèle à leur page principale.

La spécification aborde également la question de la répartition des travailleurs sur plusieurs cœurs, pour une véritable concurrence (ceci est géré de manière invisible par le moteur JavaScript du navigateur) :

Avec la généralisation des processeurs multicœurs, une façon d'obtenir de meilleures performances est de répartir les tâches coûteuses en calcul entre plusieurs travailleurs. Dans [un] exemple, une tâche coûteuse en calcul qui doit être exécutée pour chaque nombre de 1 à 10 000 000 est confiée à dix sous-workers.

yield() y setInterval() ne font que programmer des choses qui se produiront plus tard, elles ne s'exécutent pas en même temps que d'autres choses.

4voto

Keldon Alleyne Points 1399

Je me demande comment on peut réaliser le multithreading en JavaScript ? D'autres méthodes importantes ?

Vous pouvez faire transformer votre code en un code JavaScript qui ne comporte pas de boucles explicites ni d'appels directs de fonctions, mais qui est divisé en petites parties. unités d'exécution qui sont gérés par un moteur de threads. Dans mon exemple de code, je montre comment une fonction avec des boucles serait transformée, mais j'ai omis le mécanisme d'appel de fonction pour garder l'exemple simple.

Le processus de transformation fonctionne essentiellement comme suit fendant aux points de division. Ces points de division sont des appels de fonction et des boucles (comme démontré ci-dessus). Dans l'exemple, j'ai utilisé des objets et des clés, mais les moteurs JavaScript du navigateur seront plus faciles à utiliser si l'option unités stocké le pile en tant que variable objet (c'est-à-dire en stockant en utilisant la fonction this.foo = bar au lieu de stack["foo"] = bar ).

Par exemple, le code suivant :

// Phoney method purely to demonstrate structure
function Foo() {
  var i,
      sum = 0,
      accumulator_list = [],
      accumulator_modulus = [],
      kMaxAccumulatorCount = 100;

  // Calculate accumulations
  for(i = 0; i < kMaxAccumulatorCount; ++i) {
    current_accumulator = GetNextAccumulator()
    accumulator_list[i] = current_accumulator;
    sum = sum + current_accumulator;
  }

  // Calculate accumulator modulus
  for(i = 0; i < kMaxAccumulatorCount; ++i) {
    current_accumulator = accumulator_list[i];
    accumulator_modulus[i] = current_accumulator % kMaxAccumulatorCount;
  }
}

... en quelque chose comme ça :

function Foo_A(caller,stack) {
  var stack = {};
  stack["i"] = undefined;
  stack["sum"] = 0;
  stack["accumulator_list"] = [];
  stack["accumulator_modulus"] = [];
  stack["kMaxAccumulatorCount"] = 100;

  stack["i"] = 0;
  return {caller: caller, stack: stack, next=Foo_B};
}

function Foo_B(caller, stack) {
  stack["current_accumulator"] = GetNextAccumulator();
  stack["accumulator_list"][stack["i"]] = stack["current_accumulator"];
  stack["sum"] = stack["sum"] + stack["current_accumulator"];

  // For-loop condition satisfied ?
  if(stack["i"] < stack["kMaxAccumulatorCount"]) {
    ++stack["i"];
    return {caller: caller, stack: stack, next:Foo_B};
  } else {
    // Initialise the next for loop.
    stack["i"] = 0;
    return {caller: caller, stack: stack, next:Foo_C};
  }
}

function Foo_C(caller, stack) {
  stack["current_accumulator"] = stack["current_accumulator"][stack["i"]];
  stack["accumulator_modulus"][stack["i"]] = stack["current_accumulator"] % stack["kMaxAccumulatorCount"];

  // For-loop condition satisfied ?
  if(stack["i"] < stack["kMaxAccumulatorCount"]) {
    ++stack["i"];
    return {caller: caller, stack: stack, next:Foo_C};
  } else {
    // Function has finished so the next will be null. When the thread-engine sees this it simulates the behaviour of a return, pops its virtual stack and returns execution to the caller
    return {caller: caller, stack: stack, next:null};
  }
}

3voto

kwh Points 31

Multithread.js est une bibliothèque permettant d'effectuer facilement du multithreading en JS, qui englobe les Web Workers et effectue la majeure partie du travail à votre place :)

1voto

BenG Points 513

Q : comment faire autrement pour obtenir la concurrence en Javascript ?

Vous pouvez utiliser des méthodes de type asynchrone ou "non bloquant". C'est l'un des principaux arguments en faveur du système node.js. Il n'est pas exactement multithreadé, mais il a tendance à être plus rapide.

1voto

Il n'existe pas de support direct pour le multithreading en JavaScript. Cependant, vous pouvez y parvenir en appliquant certaines idées et méthodes.

Il existe des méthodes comme :

var id = window.timeout("javascript code", time);

ici le code JavaScript est appelé après le temps spécifié et nous pouvons utiliser

window.clearTimeout(id);

pour le nettoyage. De cette manière, nous pouvons obtenir une fausse concurrence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X