Table des matières
先决条件
worker_threads 介绍
worker_threads 如何工作
worker_threads 具体使用
worker_threads 运算斐波那契数列
Prérequis
Introduction à worker_threads

Introduction à Worker_threads
  • strong>
  • Comment fonctionne Worker_threads
    Utilisation spécifique de Worker_threads
    worker_threads Operation Fibonacci Sequence
    结论
    思考
    Maison interface Web js tutoriel Parlons de la façon dont Node.js + worker_threads implémente le multi-threading ? (explication détaillée)

    Parlons de la façon dont Node.js + worker_threads implémente le multi-threading ? (explication détaillée)

    Feb 11, 2022 pm 08:07 PM
    node.js 多线程

    Cet article vous fera découvrir le module worker_threads, vous présentera comment utiliser worker_threads pour implémenter le multi-threading dans Node et utiliser worker_threads pour exécuter la séquence de Fibonacci comme exemple pratique. J'espère que cela sera utile à tout le monde !

    Parlons de la façon dont Node.js + worker_threads implémente le multi-threading ? (explication détaillée)

    Normalement, Node.jsNode.js被认为是单线程。由主线程去按照编码顺序一步步执行程序代码,一旦遇到同步代码阻塞,主线程就会被占用,后续的程序代码的执行都会被卡住。没错Node.js的单线程指的是主线程是"单线程"。

    为了解决单线程带来的问题,本文的主角worker_threads出现了。worker_threads首次在Node.js v10.5.0作为实验性功能出现,需要命令行带上--experimental-worker才能使用。直到v12.11.0稳定版才能正式使用。

    本文将会介绍worker_threads的使用方式,以及利用worker_threads执行斐波那契数列作为实践例子。

    先决条件

    阅读并食用本文,需要先具备:

    • 安装了 Node.js v12.11.0 及以上版本
    • 掌握 JavaScript 同步和异步编程的基础知识
    • 掌握 Node.js 的工作原理

    worker_threads 介绍

    worker_threads 模块允许使用并行执行 JavaScript 的线程。

    工作线程对于执行 CPU 密集型的 JavaScript 操作很有用。 它们对 I/O 密集型的工作帮助不大。 Node.js 内置的异步 I/O 操作比工作线程更高效。

    与 child_process 或 cluster 不同,worker_threads 可以共享内存。 它们通过传输 ArrayBuffer 实例或共享 SharedArrayBuffer 实例来实现。

    由于以下特性,worker_threads已被证明是充分利用CPU性能的最佳解决方案:

    • 它们运行具有多个线程的单个进程。

    • 每个线程执行一个事件循环。

    • 每个线程运行单个 JS 引擎实例。

    • 每个线程执行单个 Nodejs 实例。

    worker_threads 如何工作

    worker_threads通过执行主线程指定的脚本文件来工作。每个线程都在与其他线程隔离的情况下执行。但是,这些线程可以通过消息通道来回传递消息。

    主线程使用worker.postMessage()函数使用消息通道,而工作线程使用parentPort.postMessage()函数。

    通过官方示例代码加强了解:

    const {
      Worker, isMainThread, parentPort, workerData
    } = require('worker_threads');
    
    if (isMainThread) {
      module.exports = function parseJSAsync(script) {
        return new Promise((resolve, reject) => {
          const worker = new Worker(__filename, {
            workerData: script
          });
          worker.on('message', resolve);
          worker.on('error', reject);
          worker.on('exit', (code) => {
            if (code !== 0)
              reject(new Error(`Worker stopped with exit code ${code}`));
          });
        });
      };
    } else {
      const { parse } = require('some-js-parsing-library');
      const script = workerData;
      parentPort.postMessage(parse(script));
    }
    Copier après la connexion

    上述代码主线程工作线程都使用同一份文件作为执行脚本(__filename为当前执行文件路径),通过isMainThread来区分主线程工作线程运行时逻辑。当模块对外暴露方法parseJSAsync被调用时候,都将会衍生子工作线程去执行调用parse函数。

    worker_threads 具体使用

    在本节使用具体例子介绍worker_threads的使用

    创建工作线程脚本文件workerExample.js:

    const { workerData, parentPort } = require('worker_threads')
    parentPort.postMessage({ welcome: workerData })
    Copier après la connexion

    创建主线程脚本文件main.js:

    const { Worker } = require('worker_threads')
    
    const runWorker = (workerData) => {
        return new Promise((resolve, reject) => {
            // 引入 workerExample.js `工作线程`脚本文件
            const worker = new Worker('./workerExample.js', { workerData });
            worker.on('message', resolve);
            worker.on('error', reject);
            worker.on('exit', (code) => {
                if (code !== 0)
                    reject(new Error(`stopped with  ${code} exit code`));
            })
        })
    }
    
    const main = async () => {
        const result = await runWorker('hello worker threads')
        console.log(result);
    }
    
    main().catch(err => console.error(err))
    Copier après la connexion

    控制台命令行执行:

    node main.js
    Copier après la connexion
    Copier après la connexion

    输出:

    { welcome: 'hello worker threads' }
    Copier après la connexion

    worker_threads 运算斐波那契数列

    在本节中,让我们看一下 CPU 密集型示例,生成斐波那契数列

    如果在没有工作线程的情况下完成此任务,则会随着nth期限的增加而阻塞主线程。

    创建工作线程脚本文件worker.js

    const {parentPort, workerData} = require("worker_threads");
    
    parentPort.postMessage(getFibonacciNumber(workerData.num))
    
    function getFibonacciNumber(num) {
        if (num === 0) {
            return 0;
        }
        else if (num === 1) {
            return 1;
        }
        else {
            return getFibonacciNumber(num - 1) + getFibonacciNumber(num - 2);
        }
    }
    Copier après la connexion

    创建主线程脚本文件main.js:

    const {Worker} = require("worker_threads");
    
    let number = 30;
    
    const worker = new Worker("./worker.js", {workerData: {num: number}});
    
    worker.once("message", result => {
        console.log(`${number}th Fibonacci Result: ${result}`);
    });
    
    worker.on("error", error => {
        console.log(error);
    });
    
    worker.on("exit", exitCode => {
        console.log(`It exited with code ${exitCode}`);
    })
    
    console.log("Execution in main thread");
    Copier après la connexion

    控制台命令行执行:

    node main.js
    Copier après la connexion
    Copier après la connexion

    输出:

    Execution in main thread
    30th Fibonacci Result: 832040
    It exited with code 0
    Copier après la connexion

    main.js文件中,我们从类的实例创建一个工作线程,Worker est considéré comme monothread. Le thread principal exécute le code du programme étape par étape selon la séquence de codage. Une fois le code de synchronisation bloqué, le thread principal sera occupé et l'exécution ultérieure du code du programme sera bloquée. C'est vrai, le thread unique de Node.js signifie que le thread principal est "à thread unique".

    Afin de résoudre les problèmes causés par un seul thread, le protagoniste de cet article worker_threads apparaît. worker_threads est apparu pour la première fois en tant que fonctionnalité expérimentale dans Node.js v10.5.0 et nécessite --experimental-worker sur la ligne de commande pour l'utiliser. Il ne peut pas être officiellement utilisé avant la version stable v12.11.0.

    🎜Cet article expliquera comment utiliser worker_threads et comment utiliser worker_threads pour exécuter Séquence de Fibonacci 🎜 comme exemple pratique. 🎜

    Prérequis

    🎜Pour lire et utiliser cet article, vous devez avoir : 🎜
    • Installé Node.js v12.11.0 et versions supérieures
    • Maîtriser les connaissances de base de la programmation synchrone et asynchrone JavaScript
    • Maîtriser le principe de fonctionnement de Node.js

    Introduction à worker_threads

    Introduction à Worker_threads
  • strong>
  • 🎜Le module worker_threads permet l'utilisation de threads qui exécutent du JavaScript dans parallèle. 🎜🎜Les threads de travail sont utiles pour effectuer des opérations JavaScript gourmandes en CPU. Ils ne sont pas très utiles pour les travaux intensifs en E/S. Les opérations d'E/S asynchrones intégrées de Node.js sont plus efficaces que les threads de travail. 🎜🎜Contrairement à child_process ou cluster, worker_threads peut partager la mémoire. Pour ce faire, ils transfèrent des instances ArrayBuffer ou partagent des instances SharedArrayBuffer. 🎜🎜Les worker_threads se sont avérés être la meilleure solution pour utiliser pleinement les performances du processeur grâce aux propriétés suivantes : 🎜
    • 🎜Ils exécuter Un seul processus avec plusieurs threads. 🎜
    • 🎜Chaque thread exécute une boucle d'événement. 🎜
    • 🎜Chaque thread exécute une seule instance du moteur JS. 🎜
    • 🎜Chaque thread exécute une seule instance 🎜Nodejs🎜. 🎜

    Comment fonctionne Worker_threads

    🎜worker_threadsen exécutant le spécifié par le <code>thread principal< /code> >fichier de script pour fonctionner. Chaque thread s'exécute indépendamment des autres threads. Cependant, ces fils de discussion peuvent transmettre des messages via des canaux de messagerie. 🎜🎜Main thread utilise la fonction worker.postMessage() pour utiliser le canal de message, tandis que worker thread utilise parentPort.postMessage( ) code> fonction. 🎜🎜Améliorez votre compréhension grâce à l'exemple de code officiel : 🎜
    console.log("Execution in main thread");
    Copier après la connexion
    Copier après la connexion
    🎜Le code ci-dessus thème principal et les Threads de travail utilisent tous le même fichier que le script d'exécution (__filename est le chemin du fichier d'exécution actuel), et le thread principal se distingue par < code>isMainThread > Logique d'exécution avec threads de travail. Lorsque la méthode parseJSAsync exposée en externe du module est appelée, un thread sous-travailleur sera généré pour exécuter la fonction parse. 🎜

    Utilisation spécifique de Worker_threads

    🎜Dans cette section, nous utilisons des exemples spécifiques pour présenter l'utilisation de worker_threads🎜🎜Créer un worker thread</ code> fichier de script <code>workerExample.js :🎜rrreee🎜Créer un thread principal fichier de script main.js :🎜rrreee🎜Exécution de la ligne de commande de la console :🎜 rrreee🎜output :🎜rrreee

    worker_threads Operation Fibonacci Sequence

    🎜Dans cette section, regardons un exemple gourmand en CPU, générant
    Nombres de Fibonacci 🎜. 🎜🎜Si cette tâche est terminée sans thread de travail, le thread principal sera bloqué à mesure que le énième délai augmente. 🎜🎜Créez le fichier de script thread de travail worker.js🎜rrreee🎜Créez le fichier de script thread principal main.js : 🎜rrreee🎜Exécution de la ligne de commande de la console : 🎜rrreee🎜Sortie : 🎜rrreee🎜Dans le fichier main.js, nous créons un thread de travail à partir d'une instance de la classe, Worker comme nous l'avons vu dans l'exemple précédent. 🎜🎜Afin d'obtenir les résultats, nous écoutons 3 événements, 🎜
    • message响应工作线程发出消息。
    • exit工作线程停止执行的情况下触发的事件。
    • error发生错误时触发。

    我们在最后一行main.js

    console.log("Execution in main thread");
    Copier après la connexion
    Copier après la connexion

    通过控制台的输出可得,主线程并没有被斐波那契数列运算执行而阻塞。

    因此,只要在工作线程中处理 CPU 密集型任务,我们就可以继续处理其他任务而不必担心阻塞主线程。

    结论

    Node.js 在处理 CPU 密集型任务时一直因其性能而受到批评。通过有效地解决这些缺点,工作线程的引入提高了 Node.js 的功能。

    有关worker_threads的更多信息,请在此处访问其官方文档。

    思考

    文章结束前留下思考,后续会在评论区做补充,欢迎一起讨论。

    • worker_threads线程空闲时候会被回收吗?
    • worker_threads共享内存如何使用?
    • 既然说到线程,那么应该有线程池?

    更多node相关知识,请访问:nodejs 教程

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration de ce site Web
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

    Outils d'IA chauds

    Undresser.AI Undress

    Undresser.AI Undress

    Application basée sur l'IA pour créer des photos de nu réalistes

    AI Clothes Remover

    AI Clothes Remover

    Outil d'IA en ligne pour supprimer les vêtements des photos.

    Undress AI Tool

    Undress AI Tool

    Images de déshabillage gratuites

    Clothoff.io

    Clothoff.io

    Dissolvant de vêtements AI

    AI Hentai Generator

    AI Hentai Generator

    Générez AI Hentai gratuitement.

    Outils chauds

    Bloc-notes++7.3.1

    Bloc-notes++7.3.1

    Éditeur de code facile à utiliser et gratuit

    SublimeText3 version chinoise

    SublimeText3 version chinoise

    Version chinoise, très simple à utiliser

    Envoyer Studio 13.0.1

    Envoyer Studio 13.0.1

    Puissant environnement de développement intégré PHP

    Dreamweaver CS6

    Dreamweaver CS6

    Outils de développement Web visuel

    SublimeText3 version Mac

    SublimeText3 version Mac

    Logiciel d'édition de code au niveau de Dieu (SublimeText3)

    Exceptions de fonctions C++ et multithreading : gestion des erreurs dans les environnements concurrents Exceptions de fonctions C++ et multithreading : gestion des erreurs dans les environnements concurrents May 04, 2024 pm 04:42 PM

    La gestion des exceptions de fonction en C++ est particulièrement importante pour les environnements multithread afin de garantir la sécurité des threads et l’intégrité des données. L'instruction try-catch vous permet d'intercepter et de gérer des types spécifiques d'exceptions lorsqu'elles se produisent afin d'éviter les plantages du programme ou la corruption des données.

    Comment implémenter le multi-threading en PHP ? Comment implémenter le multi-threading en PHP ? May 06, 2024 pm 09:54 PM

    Le multithreading PHP fait référence à l'exécution simultanée de plusieurs tâches dans un seul processus, ce qui est réalisé en créant des threads exécutés indépendamment. Vous pouvez utiliser l'extension Pthreads en PHP pour simuler le comportement multi-threading. Après l'installation, vous pouvez utiliser la classe Thread pour créer et démarrer des threads. Par exemple, lors du traitement d'une grande quantité de données, les données peuvent être divisées en plusieurs blocs et un nombre correspondant de threads peut être créé pour un traitement simultané afin d'améliorer l'efficacité.

    Utilisation du framework de tests unitaires JUnit dans un environnement multithread Utilisation du framework de tests unitaires JUnit dans un environnement multithread Apr 18, 2024 pm 03:12 PM

    Il existe deux approches courantes lors de l'utilisation de JUnit dans un environnement multithread : les tests monothread et les tests multithread. Les tests monothread s'exécutent sur le thread principal pour éviter les problèmes de concurrence, tandis que les tests multithread s'exécutent sur les threads de travail et nécessitent une approche de test synchronisée pour garantir que les ressources partagées ne sont pas perturbées. Les cas d'utilisation courants incluent le test de méthodes multi-thread-safe, telles que l'utilisation de ConcurrentHashMap pour stocker des paires clé-valeur, et des threads simultanés pour opérer sur les paires clé-valeur et vérifier leur exactitude, reflétant l'application de JUnit dans un environnement multi-thread. .

    Comment la concurrence et le multithreading des fonctions Java peuvent-ils améliorer les performances ? Comment la concurrence et le multithreading des fonctions Java peuvent-ils améliorer les performances ? Apr 26, 2024 pm 04:15 PM

    Les techniques de concurrence et de multithreading utilisant les fonctions Java peuvent améliorer les performances des applications, notamment en suivant les étapes suivantes : Comprendre les concepts de concurrence et de multithreading. Tirez parti des bibliothèques de concurrence et multithread de Java telles que ExecutorService et Callable. Pratiquez des cas tels que la multiplication matricielle multithread pour réduire considérablement le temps d'exécution. Profitez des avantages d’une vitesse de réponse accrue des applications et d’une efficacité de traitement optimisée grâce à la concurrence et au multithreading.

    Comment se comportent les fonctions PHP dans un environnement multithread ? Comment se comportent les fonctions PHP dans un environnement multithread ? Apr 16, 2024 am 10:48 AM

    Dans un environnement multi-thread, le comportement des fonctions PHP dépend de leur type : Fonctions normales : thread-safe, peuvent être exécutées simultanément. Fonctions qui modifient les variables globales : dangereuses, doivent utiliser un mécanisme de synchronisation. Fonction d'opération de fichier : dangereuse, nécessité d'utiliser un mécanisme de synchronisation pour coordonner l'accès. Fonction d'exploitation de la base de données : dangereux, le mécanisme du système de base de données doit être utilisé pour éviter les conflits.

    Comment gérer les ressources partagées en multi-threading en C++ ? Comment gérer les ressources partagées en multi-threading en C++ ? Jun 03, 2024 am 10:28 AM

    Les mutex sont utilisés en C++ pour gérer des ressources partagées multithread : créez des mutex via std::mutex. Utilisez mtx.lock() pour obtenir un mutex et fournir un accès exclusif aux ressources partagées. Utilisez mtx.unlock() pour libérer le mutex.

    Défis et stratégies pour tester les programmes multithread en C++ Défis et stratégies pour tester les programmes multithread en C++ May 31, 2024 pm 06:34 PM

    Les tests de programmes multithread sont confrontés à des défis tels que la non-répétabilité, les erreurs de concurrence, les blocages et le manque de visibilité. Les stratégies incluent : Tests unitaires : écrivez des tests unitaires pour chaque thread afin de vérifier le comportement du thread. Simulation multithread : utilisez un framework de simulation pour tester votre programme en contrôlant la planification des threads. Détection de courses aux données : utilisez des outils pour trouver des courses aux données potentielles, tels que valgrind. Débogage : utilisez un débogueur (tel que gdb) pour examiner l'état du programme d'exécution et trouver la source de la course aux données.

    Défis et contre-mesures de la gestion de la mémoire C++ dans un environnement multithread ? Défis et contre-mesures de la gestion de la mémoire C++ dans un environnement multithread ? Jun 05, 2024 pm 01:08 PM

    Dans un environnement multithread, la gestion de la mémoire C++ est confrontée aux défis suivants : courses de données, blocages et fuites de mémoire. Les contre-mesures incluent : 1. L'utilisation de mécanismes de synchronisation, tels que les mutex et les variables atomiques ; 2. L'utilisation de structures de données sans verrouillage ; 3. L'utilisation de pointeurs intelligents ; 4. (Facultatif) La mise en œuvre du garbage collection ;

    See all articles