Banyak orang yang tidak mengerti bagaimana NodeJS single-thread dapat bersaing dengan backend multi-thread.
Untuk mengetahui alasannya, kita harus memahami apa sebenarnya arti Nodejs adalah single-threaded.
JavaScript sendiri awalnya dibuat untuk melakukan hal-hal sederhana seperti memvalidasi formulir, membuat respons, dll. Baru pada tahun 2009 pencipta Node.js, Ryan Dahl, memungkinkan untuk menulis kode sisi server menggunakan JavaScript.
Bahasa sisi server yang mendukung multithreading memiliki berbagai struktur dan konstruksi untuk sinkronisasi antar thread dan fitur berorientasi thread lainnya.
Mendukung hal-hal ini berarti JavaScript perlu mengubah keseluruhan bahasanya, yang bertentangan dengan ide pembuat JavaScript. Oleh karena itu, untuk mendukung multi-threading dalam JavaScript murni, Dahl harus membuat solusi. Mari kita lihat!
Bagaimana cara kerja Node.js?
Node.js menggunakan dua jenis thread: thread utama, yang ditangani oleh loop peristiwa, dan beberapa thread sekunder dalam kumpulan thread pekerja.
Mekanisme Event Loop Node.js untuk menangani operasi I/O non-pemblokiran—meskipun JavaScript adalah thread tunggal—membongkar operasi ke kernel sistem jika memungkinkan. Ketika operasi JavaScript memblokir thread, loop peristiwa juga diblokir.
Kumpulan pekerja adalah model eksekusi yang memunculkan dan memproses thread terpisah, kemudian menjalankan tugas secara sinkron dan mengembalikan hasilnya ke loop peristiwa. Perulangan peristiwa kemudian menggunakan hasil tersebut untuk mengeksekusi panggilan balik yang disediakan.
Pada dasarnya, kumpulan pekerja menangani operasi I/O asinkron - terutama interaksi dengan disk sistem dan jaringan. Beberapa modul menggunakan kumpulan pekerja yang siap pakai, seperti fs (berat I/O) atau crypto (berat CPU). Kumpulan pekerja diimplementasikan di libuv, yang menyebabkan sedikit penundaan namun hampir dapat diabaikan ketika Node perlu mentransfer data secara internal antara JavaScript dan C++.
Setelah memahami pengertian event loop dan work pool, mari kita lihat kode berikut:
Pada kode di atas, kita tidak perlu menunggu event secara sinkron. Kami mendelegasikan tugas membaca file ke kumpulan pekerja dan memanggil fungsi yang disediakan dengan hasilnya. Karena kumpulan pekerja memiliki threadnya sendiri, perulangan peristiwa dapat terus berjalan secara normal saat membaca file.
Izinkan saya memperkenalkan kepada Anda: Worker_threads
Dengan dirilisnya Node.js 10.5.0, Worker_threads muncul. Ini mendukung pembuatan aplikasi multi-threaded sederhana dalam JavaScriptworker_threads
adalah paket modul nodejs. Pekerja thread adalah sepotong kode (biasanya diambil dari file) yang dihasilkan di thread terpisah.
Penting untuk dicatat bahwa istilah pekerja thread, pekerja, dan thread sering digunakan secara bergantian. Semuanya mengacu pada hal yang sama.
Utas pekerja di Node.js berguna untuk melakukan tugas-tugas JavaScript yang berat. Dengan bantuan thread, Pekerja dapat dengan mudah menjalankan kode JavaScript secara paralel, membuatnya lebih cepat dan efisien. Kita bisa menyelesaikan tugas berat tanpa mengganggu thread utama.
Thread pekerja tidak diperkenalkan di Node.js versi lama. Jadi pertama-tama perbarui Node.js Anda untuk memulai.
Sekarang buatlah dua file untuk mengimplementasikan thread sebagai berikut:
Nama file:worker.js
const {workerData, parentPort } = require('worker_threads'); console.log(`Tuliskan bagaimana ${workerData} ingin bersantai bersama orang-orang besar`); parentPort.postMessage({ nama file: data pekerja, status: 'Selesai' });
Nama file: index.js
const { Pekerja } = memerlukan('pekerja_threads'); const runSerice = (Data pekerja) => { kembalikan Janji baru((putuskan, tolak) => { const pekerja = Pekerja baru('./worker.js', { data pekerja }); pekerja.on('pesan', tekad); pekerja.on('kesalahan', tolak); pekerja.on('keluar', (kode) => { jika (kode !== 0) reject(new Error(`Worker Thread terhenti dengan kode keluar ${code}`)); }); }); }; const jalankan = async () => { hasil const = menunggu runSerice('Tunde Ednut'); console.log(hasil); }; jalankan().catch((err) => console.error(err))
;