Apakah ada cara untuk membuat utas untuk menjalankan beberapa metode sekaligus?
Dengan begitu, jika ada metode yang gagal di antara semua utas lainnya harus dimatikan.
Apakah ada cara untuk membuat utas untuk menjalankan beberapa metode sekaligus?
Dengan begitu, jika ada metode yang gagal di antara semua utas lainnya harus dimatikan.
Jawaban:
Setiap proses node.js adalah single threaded by design. Oleh karena itu untuk mendapatkan banyak utas, Anda harus memiliki banyak proses (Seperti yang ditunjukkan oleh beberapa poster lain, ada juga pustaka yang dapat Anda tautkan yang akan memberi Anda kemampuan untuk bekerja dengan utas di Node, tetapi tidak ada kemampuan seperti itu tanpa pustaka tersebut. . Lihat jawaban oleh Shawn Vincent merujuk https://github.com/audreyt/node-webworker-threads )
Anda dapat memulai proses anak dari proses utama Anda seperti yang ditunjukkan di sini dalam dokumentasi node.js: http://nodejs.org/api/child_process.html . Contohnya cukup bagus di halaman ini dan cukup mudah.
Proses induk Anda kemudian dapat melihat penutupan acara pada setiap proses yang dimulai dan kemudian dapat memaksa menutup proses lain yang Anda mulai untuk mencapai jenis satu gagal semua strategi berhenti yang Anda bicarakan.
Lihat juga: Node.js pada mesin multi-inti
Ada juga setidaknya satu library untuk melakukan penguliran asli dari dalam Node.js: node-webworker-threads
https://github.com/audreyt/node-webworker-threads
Ini pada dasarnya mengimplementasikan API browser Web Worker untuk node.js.
Dari Node 10.5 sekarang sudah ada dukungan multi threading , tapi masih eksperimental . Semoga ini akan segera stabil.
Lihat sumber daya berikut:
Pembaruan :
Mulai Node v11.7.0 dan seterusnya, Anda tidak perlu menggunakan --experimental-worker
flag.
Catatan rilis: https://nodejs.org/en/blog/release/v11.7.0/
Anda bisa mendapatkan multi-threading menggunakan Napa.js.
https://github.com/Microsoft/napajs
"Napa.js adalah runtime JavaScript multi-utas yang dibangun pada V8, yang pada awalnya dirancang untuk mengembangkan layanan yang sangat berulang dengan kinerja yang tidak terganggu di Bing. Seiring perkembangannya, kami merasa berguna untuk melengkapi Node.js dalam tugas yang terikat dengan CPU , dengan kemampuan mengeksekusi JavaScript di beberapa isolasi V8 dan berkomunikasi di antara keduanya. Napa.js diekspos sebagai modul Node.js, sementara itu juga dapat disematkan dalam proses host tanpa ketergantungan Node.js. "
Jika Anda menggunakan Rx, cukup mudah untuk memasang plugin di rxjs-cluster untuk membagi pekerjaan menjadi eksekusi paralel. (penafian: Saya penulisnya)
Saya membutuhkan multithreading nyata di Node.js dan yang berhasil untuk saya adalah paket utasnya . Ini memunculkan proses lain yang memiliki loop pesan Node.js sendiri, jadi mereka tidak saling memblokir. Penyiapannya mudah dan dokumentasinya membuat Anda siap dan berfungsi dengan cepat. Program utama Anda dan pekerja dapat berkomunikasi dengan dua cara dan "utas" pekerja dapat dimatikan jika diperlukan.
Karena multithreading dan Node.js adalah topik yang rumit dan banyak dibahas, cukup sulit untuk menemukan paket yang sesuai dengan kebutuhan spesifik saya . Sebagai catatan, ini tidak berhasil untuk saya :
require
-ing modul pada pekerja yang saya butuhkanDan bagi mereka yang bertanya mengapa saya membutuhkan multi-threading nyata : Untuk aplikasi yang melibatkan Raspberry Pi dan interupsi. Satu utas menangani interupsi tersebut dan utas lainnya menangani penyimpanan data (dan lainnya).
The nodejs 10.5.0 rilis telah mengumumkan multithreading di Node.js . Fiturnya masih eksperimental. Ada modul worker_threads baru yang tersedia sekarang.
Anda dapat mulai menggunakan thread pekerja jika Anda menjalankan Node.js v10.5.0 atau lebih tinggi , tetapi ini adalah API eksperimental . Ini tidak tersedia secara default: Anda harus mengaktifkannya dengan menggunakan --experimental-worker saat menjalankan Node.js.
Berikut adalah contoh dengan ES6 dan worker_threads diaktifkan, diuji pada versi 12.3.1
//package.json
"scripts": {
"start": "node --experimental-modules --experimental- worker index.mjs"
},
Sekarang, Anda perlu mengimpor Worker dari worker_threads . Catatan: Anda perlu mendeklarasikan file js Anda dengan ekstensi '.mjs' untuk dukungan ES6.
//index.mjs
import { Worker } from 'worker_threads';
const spawnWorker = workerData => {
return new Promise((resolve, reject) => {
const worker = new Worker('./workerService.mjs', { workerData });
worker.on('message', resolve);
worker.on('error', reject);
worker.on('exit', code => code !== 0 && reject(new Error(`Worker stopped with
exit code ${code}`)));
})
}
const spawnWorkers = () => {
for (let t = 1; t <= 5; t++)
spawnWorker('Hello').then(data => console.log(data));
}
spawnWorkers();
Terakhir, kami membuat workerService.mjs
//workerService.mjs
import { workerData, parentPort, threadId } from 'worker_threads';
// You can do any cpu intensive tasks here, in a synchronous way
// without blocking the "main thread"
parentPort.postMessage(`${workerData} from worker ${threadId}`);
Keluaran:
npm jalankan mulai
Hello from worker 4
Hello from worker 3
Hello from worker 1
Hello from worker 2
Hello from worker 5
Sekarang juga ada https://github.com/xk/node-threads-a-gogo , meskipun saya tidak yakin tentang status proyek.
NodeJS sekarang menyertakan utas (sebagai fitur eksperimental pada saat menjawab).
Anda mungkin mencari Promise.race
(solusi balapan I / O asli, bukan utas)
Dengan asumsi Anda (atau orang lain yang menelusuri pertanyaan ini) ingin balapan untaian untuk menghindari kegagalan dan menghindari biaya operasi I / O, ini adalah cara sederhana dan asli untuk menyelesaikannya (yang tidak menggunakan utas). Node dirancang untuk menjadi single thread (cari event loop), jadi hindari menggunakan thread jika memungkinkan. Jika asumsi saya benar, saya sarankan Anda menggunakan Promise.race
dengan setTimeout
(contoh di tautan). Dengan strategi ini, Anda akan berlomba dengan daftar janji yang masing-masing mencoba beberapa operasi I / O dan menolak janji jika ada kesalahan (jika tidak, batas waktu). The Promise.race
pernyataan berlanjut setelah yang pertama resolusi / penolakan, yang tampaknya menjadi apa yang Anda inginkan. Semoga ini bisa membantu seseorang!
Node.js tidak menggunakan threading. Menurut penemunya, itulah ciri utama. Pada saat penemuannya, utasnya lambat, bermasalah, dan sulit. Node.js dibuat sebagai hasil investigasi terhadap alternatif inti tunggal yang efisien. Sebagian besar penggemar Node.js masih mengutip argumen Anda seolah-olah utas belum diperbaiki selama 50 tahun terakhir.
Seperti yang Anda ketahui, Node.js digunakan untuk menjalankan JavaScript. Bahasa JavaScript juga telah berkembang selama bertahun-tahun. Sekarang ada cara untuk menggunakan banyak inti - yaitu apa yang dilakukan Thread. Jadi, melalui kemajuan dalam JavaScript, Anda dapat melakukan beberapa multi-core multi-tasking dalam aplikasi Anda. user158 menunjukkan bahwa Node.js sedikit bermain dengannya. Saya tidak tahu apa-apa tentang itu. Tapi mengapa menunggu Node.js untuk menyetujui apa yang ditawarkan JavaScript.
Google untuk multi-threading JavaScript, bukan multi-threading Node.js. Anda akan mengetahui tentang Pekerja Web, Janji, dan hal-hal lain.