Jadual Kandungan
Prasyarat
Pengenalan kepada worker_threads
Cara worker_threads berfungsi
penggunaan khusus worker_threads
worker_threads beroperasi pada Jujukan Fibonacci
结论
思考
Rumah hujung hadapan web tutorial js Mari kita bincangkan tentang cara Node.js worker_threads melaksanakan multi-threading? (penjelasan terperinci)

Mari kita bincangkan tentang cara Node.js worker_threads melaksanakan multi-threading? (penjelasan terperinci)

Feb 11, 2022 pm 08:07 PM
node.js multithreading

Artikel ini akan memperkenalkan anda kepada modul worker_threads, memperkenalkan cara menggunakan worker_threads untuk melaksanakan multi-threading dalam Node dan menggunakan worker_threads untuk melaksanakan jujukan Fibonacci sebagai contoh yang praktikal berguna kepada semua orang!

Mari kita bincangkan tentang cara Node.js worker_threads melaksanakan multi-threading? (penjelasan terperinci)

Biasanya, Node.js dianggap sebagai satu benang. Benang utama melaksanakan kod program langkah demi langkah mengikut urutan pengekodan Setelah kod penyegerakan disekat, utas utama akan diduduki, dan pelaksanaan seterusnya kod program akan tersekat. Betul, utas tunggal Node.js merujuk kepada utas utama sebagai "benang tunggal".

Untuk menyelesaikan masalah yang disebabkan oleh satu utas, protagonis artikel ini worker_threads muncul. worker_threads mula-mula muncul dalam Node.js v10.5.0 sebagai ciri percubaan dan memerlukan --experimental-worker untuk digunakan dalam baris arahan. Ia tidak boleh digunakan secara rasmi sehingga v12.11.0 versi stabil.

Artikel ini akan memperkenalkan cara menggunakan worker_threads dan menggunakan worker_threads untuk melaksanakan jujukan Fibonacci sebagai contoh praktikal.

Prasyarat

Untuk membaca dan menggunakan artikel ini, anda perlu mempunyai:

  • Dipasang Node.js v12.11.0 dan ke atas
  • Kuasai asas pengaturcaraan segerak dan tak segerak JavaScript
  • Kuasai cara Node.js berfungsi

Pengenalan kepada worker_threads

worker_threads Modul membenarkan penggunaan utas yang melaksanakan JavaScript secara selari.

Benang pekerja berguna untuk melaksanakan operasi JavaScript intensif CPU. Mereka tidak begitu membantu untuk kerja intensif I/O. Operasi I/O tak segerak terbina dalam Node.js adalah lebih cekap daripada benang pekerja.

berbeza daripada child_process atau cluster kerana worker_threads boleh berkongsi memori. Mereka melakukan ini dengan mengangkut ArrayBuffer tika atau berkongsi SharedArrayBuffer tika.

worker_threads telah terbukti sebagai penyelesaian terbaik untuk menggunakan sepenuhnya prestasi CPU kerana ciri-ciri berikut:

  • Mereka menjalankan satu proses dengan berbilang benang.

  • Setiap urutan melaksanakan gelung acara.

  • Jalankan satu contoh enjin JS setiap utas.

  • Setiap urutan melaksanakan satu contoh Nodej tunggal.

Cara worker_threads berfungsi

worker_threads berfungsi dengan melaksanakan 主线程 yang ditentukan oleh 脚本文件. Setiap utas dilaksanakan secara berasingan daripada utas lain. Walau bagaimanapun, urutan ini boleh menghantar mesej berulang-alik melalui saluran mesej.

主线程 menggunakan fungsi worker.postMessage() untuk menggunakan saluran mesej, manakala 工作线程 menggunakan fungsi parentPort.postMessage().

Tingkatkan pemahaman anda melalui kod contoh rasmi:

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));
}
Salin selepas log masuk

Kedua-dua kod di atas 主线程 dan 工作线程 menggunakan kod yang sama fail untuk Skrip pelaksanaan (__filename ialah laluan fail pelaksanaan semasa), gunakan isMainThread untuk membezakan 主线程 dan 工作线程 logik masa jalan. Apabila kaedah pendedahan luaran modul parseJSAsync dipanggil, urutan sub-pekerja akan dihasilkan untuk melaksanakan fungsi parse panggilan.

penggunaan khusus worker_threads

Dalam bahagian ini, kami menggunakan contoh khusus untuk memperkenalkan penggunaan worker_threads

Buat fail skrip 工作线程 workerExample.js:

const { workerData, parentPort } = require('worker_threads')
parentPort.postMessage({ welcome: workerData })
Salin selepas log masuk

Buat 主线程fail skripmain.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))
Salin selepas log masuk

Pelaksanaan baris arahan konsol:

node main.js
Salin selepas log masuk
Salin selepas log masuk

Output:

{ welcome: 'hello worker threads' }
Salin selepas log masuk

worker_threads beroperasi pada Jujukan Fibonacci

Dalam bahagian ini, mari kita lihat contoh intensif CPU untuk menjana Jujukan Fibonacci.

Jika tugasan ini diselesaikan tanpa utas pekerja, utas utama akan disekat apabila tarikh akhir nth meningkat.

Buat 工作线程fail skripworker.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);
    }
}
Salin selepas log masuk

Buat 主线程fail skripmain.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");
Salin selepas log masuk

Pelaksanaan baris arahan konsol:

node main.js
Salin selepas log masuk
Salin selepas log masuk

Output:

Execution in main thread
30th Fibonacci Result: 832040
It exited with code 0
Salin selepas log masuk

Dalam fail main.js kita mencipta urutan pekerja daripada contoh kelas, Worker seperti yang kita lihat dalam contoh sebelumnya.

Untuk mendapatkan keputusan, kami mendengar 3 acara,

  • message响应工作线程发出消息。
  • exit工作线程停止执行的情况下触发的事件。
  • error发生错误时触发。

我们在最后一行main.js

console.log("Execution in main thread");
Salin selepas log masuk

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

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

结论

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

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

思考

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

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

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

Atas ialah kandungan terperinci Mari kita bincangkan tentang cara Node.js worker_threads melaksanakan multi-threading? (penjelasan terperinci). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Pengecualian fungsi C++ dan multithreading: pengendalian ralat dalam persekitaran serentak Pengecualian fungsi C++ dan multithreading: pengendalian ralat dalam persekitaran serentak May 04, 2024 pm 04:42 PM

Pengendalian pengecualian fungsi dalam C++ amat penting untuk persekitaran berbilang benang untuk memastikan keselamatan benang dan integriti data. Pernyataan cuba-tangkap membolehkan anda menangkap dan mengendalikan jenis pengecualian tertentu apabila ia berlaku untuk mengelakkan ranap program atau rasuah data.

Bagaimana untuk melaksanakan multi-threading dalam PHP? Bagaimana untuk melaksanakan multi-threading dalam PHP? May 06, 2024 pm 09:54 PM

PHP multithreading merujuk kepada menjalankan berbilang tugas secara serentak dalam satu proses, yang dicapai dengan mencipta benang berjalan secara bebas. Anda boleh menggunakan sambungan Pthreads dalam PHP untuk mensimulasikan tingkah laku berbilang benang Selepas pemasangan, anda boleh menggunakan kelas Thread untuk mencipta dan memulakan utas. Contohnya, apabila memproses sejumlah besar data, data boleh dibahagikan kepada berbilang blok dan bilangan benang yang sepadan boleh dibuat untuk memprosesnya secara serentak untuk meningkatkan kecekapan.

Penggunaan rangka kerja ujian unit JUnit dalam persekitaran berbilang benang Penggunaan rangka kerja ujian unit JUnit dalam persekitaran berbilang benang Apr 18, 2024 pm 03:12 PM

Terdapat dua pendekatan biasa apabila menggunakan JUnit dalam persekitaran berbilang benang: ujian berbenang tunggal dan ujian berbilang benang. Ujian berutas tunggal dijalankan pada utas utama untuk mengelakkan isu konkurensi, manakala ujian berbilang utas dijalankan pada utas pekerja dan memerlukan pendekatan ujian disegerakkan untuk memastikan sumber yang dikongsi tidak terganggu. Kes penggunaan biasa termasuk menguji kaedah selamat berbilang benang, seperti menggunakan ConcurrentHashMap untuk menyimpan pasangan nilai kunci, dan utas serentak untuk beroperasi pada pasangan nilai kunci dan mengesahkan ketepatannya, mencerminkan aplikasi JUnit dalam persekitaran berbilang benang. .

Bagaimanakah concurrency dan multithreading fungsi Java boleh meningkatkan prestasi? Bagaimanakah concurrency dan multithreading fungsi Java boleh meningkatkan prestasi? Apr 26, 2024 pm 04:15 PM

Teknik concurrency dan multithreading menggunakan fungsi Java boleh meningkatkan prestasi aplikasi, termasuk langkah berikut: Memahami konsep concurrency dan multithreading. Manfaatkan pustaka konkurensi dan berbilang benang Java seperti ExecutorService dan Callable. Amalkan kes seperti pendaraban matriks berbilang benang untuk memendekkan masa pelaksanaan. Nikmati kelebihan peningkatan kelajuan tindak balas aplikasi dan kecekapan pemprosesan yang dioptimumkan yang dibawa oleh concurrency dan multi-threading.

Bagaimanakah fungsi PHP berkelakuan dalam persekitaran berbilang benang? Bagaimanakah fungsi PHP berkelakuan dalam persekitaran berbilang benang? Apr 16, 2024 am 10:48 AM

Dalam persekitaran berbilang benang, gelagat fungsi PHP bergantung pada jenisnya: Fungsi biasa: thread-safe, boleh dilaksanakan secara serentak. Fungsi yang mengubah suai pembolehubah global: tidak selamat, perlu menggunakan mekanisme penyegerakan. Fungsi operasi fail: tidak selamat, perlu menggunakan mekanisme penyegerakan untuk menyelaraskan akses. Fungsi operasi pangkalan data: Mekanisme sistem pangkalan data yang tidak selamat perlu digunakan untuk mengelakkan konflik.

Bagaimana untuk menangani sumber yang dikongsi dalam multi-threading dalam C++? Bagaimana untuk menangani sumber yang dikongsi dalam multi-threading dalam C++? Jun 03, 2024 am 10:28 AM

Mutex digunakan dalam C++ untuk mengendalikan sumber perkongsian berbilang benang: buat mutex melalui std::mutex. Gunakan mtx.lock() untuk mendapatkan mutex dan menyediakan akses eksklusif kepada sumber yang dikongsi. Gunakan mtx.unlock() untuk melepaskan mutex.

Cabaran dan strategi untuk menguji program berbilang benang dalam C++ Cabaran dan strategi untuk menguji program berbilang benang dalam C++ May 31, 2024 pm 06:34 PM

Pengujian program berbilang benang menghadapi cabaran seperti ketidakbolehulangan, ralat konkurensi, kebuntuan dan kekurangan keterlihatan. Strategi termasuk: Ujian unit: Tulis ujian unit untuk setiap utas untuk mengesahkan kelakuan utas. Simulasi berbilang benang: Gunakan rangka kerja simulasi untuk menguji program anda dengan kawalan ke atas penjadualan benang. Pengesanan perlumbaan data: Gunakan alat untuk mencari perlumbaan data yang berpotensi, seperti valgrind. Nyahpepijat: Gunakan penyahpepijat (seperti gdb) untuk memeriksa status program masa jalan dan mencari sumber perlumbaan data.

Cabaran dan tindakan balas pengurusan memori C++ dalam persekitaran berbilang benang? Cabaran dan tindakan balas pengurusan memori C++ dalam persekitaran berbilang benang? Jun 05, 2024 pm 01:08 PM

Dalam persekitaran berbilang benang, pengurusan memori C++ menghadapi cabaran berikut: perlumbaan data, kebuntuan dan kebocoran memori. Tindakan balas termasuk: 1. Menggunakan mekanisme penyegerakan, seperti mutex dan pembolehubah atom 2. Menggunakan struktur data tanpa kunci 3. Menggunakan penunjuk pintar 4. (Pilihan) Melaksanakan pengumpulan sampah;

See all articles