Nod boleh mendayakan multi-threading; anda boleh menggunakan modul "child_process" yang disertakan dengan nod untuk mendayakan multi-threading. ; menggunakan modul ini anda boleh Mencipta empat jenis proses anak: exec, execFile, spawn dan fork.
Persekitaran pengendalian tutorial ini: sistem Windows 10, nodejs versi 12.19.0, komputer Dell G3.
Nod boleh mendayakan multi-threading
Kita semua tahu bahawa Node.js berjalan dalam mod single-threaded . Tetapi ia menggunakan dipacu peristiwa untuk mengendalikan konkurensi Berdasarkan model I/O yang dipacu peristiwa, ia menggunakan sepenuhnya I/O tak segerak yang disediakan oleh sistem pengendalian untuk pelaksanaan berbilang tugas untuk senario aplikasi intensif I/O kerana Asynchronous, program tidak perlu menyekat dan menunggu keputusan dikembalikan
Kemunculan multi-threading NodeJS bukan untuk menambah baik concurrency, tetapi untuk meningkatkan sepenuhnya CPU penggunaan
Beberapa cara untuk membuka multi-threading
Gunakan modul child_process yang disertakan dengan Node
child_process.fork(modulePath[, args][, options])
untuk menghasilkan proses Node.js baharu dan menggunakan IPC yang telah ditetapkan saluran komunikasi (yang membenarkan mesej dihantar antara proses ibu bapa dan anak) untuk memanggil modul yang ditentukan
kluster Modul kluster dengan mudah boleh membuat proses anak yang berkongsi port pelayan Proses pekerja adalah dihasilkan menggunakan kaedah child_process.fork()
Buat tiga fail server.js baharu (express service) cluster.js (fail perkhidmatan berbilang benang) extensionServer.js (sub-perkhidmatan ekspres)
Pastikan anda memasang express
npm intsall express --seve-dev
const express = require("express"), //Express框架 app = express(); // api 先关接口 app.all('/userinfo', (req, res) => { res.json({ name: '自夏', msg: '我在自夏 selfsummer' }) }) app.listen(4000, () => { console.log(`子服务启动成功`); })
const { fork } = require("child_process"), express = require("express"), //Express框架 app = express(); const { pid, ppid } = require('process') // api 先关接口 app.all('/123', (req, res, next) => { console.log(`本次进程id为: ${pid}`); res.end(`本次进程id为: ${pid}`) }) app.all('/456', (req, res, next) => { console.log(`本次进程id为: ${pid}`); res.end(`本次进程id为: ${pid}`) }) app.listen(3888, () => { console.log(`服务器端启动成功 父进程 ${ppid} 当前服务进程id为 ${pid}`); // 开启多进程 fork('extensionServer.js') }) module.exports = { app, express, };
Mulakan perkhidmatan , kedua-dua perkhidmatan utama dan layan diri telah dimulakan
Anda boleh mengakses perkhidmatan utama Express dan alamat sub-perkhidmatan dengan jayanya
Gunakan modul kluster kluster untuk mendayakan multi-threading
const os = require('os'); const cluster = require('cluster'); const { log } = console; const express = require("express"); //Express框架 const app = express(); const processId = process.pid; // 判断当前是否有主进程 if (cluster.isMaster) { // 获取当前本机cpu核数,开启多线程 const cpus = os.cpus().length; for (let i = 0; i < cpus; i++){ cluster.fork() } //进程已断开连接 cluster.on('disconnect', (worker) => { console.log(`进程号 #${worker.id} 已断开`); }); // 意外退出进程 cluster.on('exit', (worker, code, signal) => { cluster.fork(); }); } else { // 引用Express主服务 开启主进程 require('./server') }
Mulakan kluster nod khidmat kluster
Sudah tentu anda boleh Teruskan buka sub-proses dalam kelompok
dan aksesnya dua kali (satu akses penyemak imbas, satu akses Posmen) selepas antara muka
Mengapa terdapat berbilang pelayan ? Dimulakan dengan jayanya. ID proses perkhidmatan semasa ialah xxx
modul menghasilkan sub-proses di bawah proses utama semasa ialah proses baharu
proses utama , proses adalah bebas daripada satu sama lain. Setiap proses mempunyai contoh V8 sendiri dan sumber sistem adalah terhad *
bilangan teras CPU*
Kami sebelum ini telah menilai sama ada terdapat proses utama
Jika terdapat proses utama, gunakan modul kluster untuk memulakan proses anak
Jika tidak, mulakan proses
Tukar sahaja kandungan fail server.js
const http = require('http')const { pid, ppid } = require('process')const server = http.createServer((req, res) => { res.end(router(req.url))})const router = (url) => { switch (url) { case '/132': return `进程${pid} 很高兴为你服务`; case '/456': return `进程${pid} 很高兴为你服务`; default: return `没有此接口` }}server.listen(3889, () => { console.log(`Server Started in process ${pid}`);})
Masih mulakan cluster.js (fail perkhidmatan berbilang benang)
Pembelajaran yang disyorkan: "tutorial video nodejs"
Atas ialah kandungan terperinci Bolehkah nod mendayakan multi-threading?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!