IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contributions JavaScript / AJAX Discussion :

Les Web Workers, du multithreadé à la demande[Web Workers simples]


Sujet :

Contributions JavaScript / AJAX

  1. #1
    Expert confirmé
    Avatar de TiranusKBX
    Homme Profil pro
    Développeur C, C++, C#, Python, PHP, HTML, JS, Laravel, Vue.js
    Inscrit en
    Avril 2013
    Messages
    1 476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur C, C++, C#, Python, PHP, HTML, JS, Laravel, Vue.js
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 476
    Points : 4 805
    Points
    4 805
    Billets dans le blog
    6
    Par défaut Les Web Workers, du multithreadé à la demande[Web Workers simples]
    Nom : workers-feature.png
Affichages : 178
Taille : 33,5 Ko
    Présentation
    Les Web Workers sont un mécanisme/API grâce auquel les instructions d'un script peuvent être exécutés dans un thread parallèle au thread d'exécution principal d'une application web.
    De ce fait il est possible de les utiliser pour les traitements lourds/long potentiellement bloquant, permettant de ne pas bloquer le thread principal et donc que la page ne freeze pas.
    La vous me dite
    Mais les fonction eval(), setTimeout() et setInterval() ne créent pas déjà un thread parallèle ?
    Et bien la réponse est non car :
    • eval() : il faut savoir que cette fonction peut retourner une valeur de retour(définie par le code parsé) donc non multi-thread
    • setTimeout() : se retrouve dans la zone de l’interprétation des événements
    • setInterval() : se retrouve dans la zone de l’interprétation des événements


    Limitations

    Et oui tout grand pouvoir qu'il soit le multithreading Javascript
    à des limitation par souci de sécurité d'accès aux données navigateur

    un Worker n'à pas accès à :
    1. Objet window
    2. Objet document
    3. Objet parent
    4. Plus généralement les Objets DOM


    un Worker à accès en lecture seulement :
    1. Objet navigator
    2. Objet location
    Nom : 01_WebWorkersinIE10BackgroundJavaScriptMakesWebAppsFaster_2.png
Affichages : 184
Taille : 74,6 Ko

    Mise en pratique
    Initialisation
    En premier lieux nous allons utiliser la méthode Worker() pour créer un web worker;
    Un Worker pouvant en créer un autre je parlerait donc par la suite de parent pour l'appelant pour ne pas se limiter au thread principal
    Les Workers sont crées avec le code venant d'un fichier javascript que celui-ci vas charger puis exécuter,
    si vous souhaiter exécuter du code écris dans un fichier déjà chargé vous devrez créer un objet Blob et passer à la méthode Worker() l'URL de ce Blob.
    Pour les URL relative depuis un code exécuté en thread principal le chemin relatif est depuis le dossier de la page,
    depuis un Worker c'est depuis le dossier dans lequel est son fichier et pour du code d'un Blob les chemins relatifs sont caducs
    Code Javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    worker = Worker("myworker.js")
    Communication
    Comme vous pouvez le voir sur l'image à droite de ce texte
    pour la communication avec le tread il faut utiliser la commande postMessage() et les données envoyées peuvent être de n'importe quel format(String, Number, Object, Array, ...)
    Pour vous expliquer comment procéder rien de mieux qu'un petit exemple
    coté parent:
    Code Javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var worker = new Worker('worker.js');
    worker.addEventListener('message', function(e) {alert("Worker say : "+e.data);}, false);
    worker.postMessage("Mon petit message");

    coté worker.js:
    Code Javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var count = 0;
    self.addEventListener('message', function(e) {
        count = count + 1;
        postMessage(e.data+" = message n°"+count);
    },false);
    Pour résultat de ce petit exemple vous auriez une fenêtre comme ce qui suis:
    Nom : Clipboard02.png
Affichages : 164
Taille : 6,2 Ko
    Nom : 1218698.png
Affichages : 171
Taille : 39,2 Ko

    Extension du code
    Imaginons que votre Worker soit pour du traitement plutôt lourd et que pour des raisons évidente de maintenabilité(les fichier de plus de 500 lignes ça commence à poser soucis ^^)
    vous le scindé en plusieurs fichier, et bien pas de soucis, la fonction importScripts() est la !
    Pour les URL relatives c'est depuis le dossier dans lequel est le fichier du Worker et pour du code d'un Blob les chemins relatifs sont caducs
    Code Javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    importScripts();                        /* Importe strictement rien */
    importScripts('foo.js');                /* Importe "foo.js" */
    importScripts('foo.js', 'bar.js');      /* Importe les 2 scripts */

    Suicide ou meurtre ?
    Pour arrêter un Web Worker vous avez 2 solutions
    1. La méthode douce avec close() depuis le Worker
    2. la méthode musclée depuis le parent avec objetworker.terminate()


    Conclusion
    Il n'est donc pas difficile de mettre en place des Web Workers, le plus compliqué étant de faire bien attention au traitement des données envoyées en message.
    De plus voici une petite recommandation: n'en abusez pas sauf si c'est vôtre trip de faire freezer les pc chargeant votre page web
    Il existe aussi une version partagée des Web Workers(pour plusieurs pages en même temps) mais comme il on un degré de complexité plus important je les aborderait dans un prochain article

    Source MDN
    Rien, je n'ai plus rien de pertinent à ajouter

  2. #2
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Merci beaucoup pour toutes tes contributions. Il faut qu'on les passe en relecture orthographique puis qu'on les gabarise au format Developpez, et ça risque de prendre un peu de temps vu notre manque de dispos ces temps-ci. Merci pour ta patience
    One Web to rule them all

Discussions similaires

  1. Quels sont les meilleurs outils pour créer un site web dynamique
    Par med_ellouze dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 28/08/2007, 00h47
  2. Réponses: 15
    Dernier message: 24/05/2007, 12h02
  3. les librairies de tags pour le développement web
    Par zizoux5 dans le forum Struts 1
    Réponses: 1
    Dernier message: 04/05/2007, 16h05
  4. [Conception] Collecter les IP des visiteurs d un site web dans une bdd
    Par dakoyaz dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 07/04/2006, 18h02
  5. Réponses: 2
    Dernier message: 30/11/2005, 11h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo