Rilis Node.js 10.5: multithreading di luar kotak


Pekan lalu, Node.js versi 10.5.0 dirilis, berisi inovasi yang sangat penting - dukungan multithreading dalam bentuk modul worker_threads . Saya akan segera melakukan reservasi. API sedang dalam tahap percobaan dan karena itu dapat berubah, tetapi sekarang Anda dapat membuat kesan pertama dan mendapatkan gagasan tentang prinsip-prinsip dan teknologi yang diletakkan dalam fondasinya. Dan jika Anda memiliki keinginan, maka ikut serta dalam menyelesaikan antarmuka, menulis kode atau memperbaiki bug (daftar masalah ).


Kisah penampilan


Sepanjang kehidupan Node.js, satu-satunya cara untuk memparalelkan komputasi adalah memulai proses baru, misalnya, menggunakan modul cluster. Karena berbagai alasan, pendekatan ini tidak sesuai dengan pengembang, khususnya karena mengarah pada pemuatan berulang kode Node.js yang dapat dieksekusi dengan semua modul bawaan ke dalam memori komputer, yang merupakan cara yang tidak efisien untuk menghabiskan sumber daya.


Namun demikian, pembahasan implementasi multithreading di Node.js selalu bertumpu pada kompleksitas V8 dan sejumlah besar tidak diketahui: bagaimana menghubungkan modul asli, berbagi memori, berkomunikasi antara thread dan banyak lagi. Dan sementara para pengembang mencari sisi mana yang mendekati topik di web, API Pekerja berhasil diimplementasikan, yang menjadi pedoman pada tahap awal. Pembangunan dimulai dengan addaleax dan telah diambil alih oleh masyarakat.


Pekerjaan aktif dilakukan selama tahun tersebut, selama persyaratan desain ditentukan dan API memperoleh fitur spesifik Node.js sendiri, dan modul itu sendiri disebut worker_threads. Di bawah ini saya akan menjelaskan secara singkat worker_threads secara umum, dan untuk studi terperinci, saya menyarankan Anda untuk mengunjungi halaman dokumentasi resmi .


Deskripsi


Seperti disebutkan di atas, tujuan pengembangan ini adalah untuk meningkatkan produktivitas dengan mendistribusikan beban melalui utas yang berbeda dalam proses yang sama, alih-alih memulai beberapa proses. Oleh karena itu, utas akan mendukung koneksi semua modul yang tersedia untuk proses utama (saat ini, modul asli tidak didukung).


Seperti pada Worker API, interaksi antara arus utama dan aliran anak dilakukan dengan mentransfer objek yang dapat ditransfer melalui postMessage, yang menghindari masalah akses simultan, meskipun itu membutuhkan akses memori tambahan untuk menyalin data. Dalam hal ini, objek seperti SharedArrayBuffer mempertahankan perilaku mereka dan tidak menyebabkan realokasi.


MessageChannel dan MessagePort diambil dari WebAPI , yang memungkinkan Anda membuat saluran pesan terisolasi dan mentransfernya di antara utas.


Untuk mencoba tindakan worker_threads, saat Anda memulai proses, Anda harus menentukan tanda khusus:


node --experimental-worker main.js 

Contoh


Karena API masih dapat berubah, saya tidak akan menjelaskannya, tetapi saya akan memberikan contoh pertukaran pesan antara utas induk dan anak, di mana utas anak melaporkan utasnya melalui MessagePort dan keluar.


Aliran utama


Kode contoh untuk utas utama:


 // main.js const {Worker} = require('worker_threads'); const worker = new Worker(__dirname + '/worker.js'); worker.on('online', () => { console.log('Worker ready'); }); worker.on('message', (msg) => { console.log('Worker message:', msg); }); worker.on('error', (err) => { console.error('Worker error:', err); }); worker.on('exit', (code) => { console.log('Worker exit code:', code); }); 

Aliran anak


Utas anak hidup sampai loop aktivitasnya kosong. Jadi, segera setelah kode dari worker.js utas akan secara otomatis ditutup. Untuk berkomunikasi dengan orang tua, parentPort digunakan:


 // worker.js const {threadId, parentPort} = require('worker_threads'); parentPort.postMessage(`Hello from thread #${threadId}.`); // Exit happens here 

Di utas anak, objek proses ditimpa, dan perilakunya sedikit berbeda dari perilaku proses di utas induk. Secara khusus, tidak ada cara untuk menanggapi sinyal SIGNINT, mengubah nilai-nilai process.env , dan memanggil process.exit akan berhenti hanya pekerja, tetapi tidak seluruh proses.


Kesimpulan


Pekerja akan sangat menyederhanakan pembuatan aplikasi yang membutuhkan interaksi antara bagian kode paralel yang dapat dieksekusi dan, yang sangat penting, membuat komunikasi dan kontrol aliran menjadi cara yang paling jelas. Dan juga akan memungkinkan untuk menghindari pembatasan spesifik platform yang disebabkan oleh perbedaan antara Windows dan Unix. Saya yakin bahwa peluang yang akan terbuka akan menarik pengembang baru yang belum memilih Node.js. Sementara itu, lanjutkan untuk memantau perubahan dan terhubung ke proses pengembangan API di repositori .


Referensi


Source: https://habr.com/ru/post/id415165/


All Articles