Rumah  >  Artikel  >  hujung hadapan web  >  Bolehkah nod mendayakan multi-threading?

Bolehkah nod mendayakan multi-threading?

WBOY
WBOYasal
2022-06-15 17:06:372949semak imbas

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.

Bolehkah nod mendayakan multi-threading?

Persekitaran pengendalian tutorial ini: sistem Windows 10, nodejs versi 12.19.0, komputer Dell G3.

Bolehkah nod mendayakan multi-threading?

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()

Bolehkah nod mendayakan multi-threading?

Gunakan berbilang proses

express

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

extensionServer.js Gunakan ekspres untuk mencipta subperkhidmatan

const express = require("express"), //Express框架
app = express();

// api 先关接口
app.all('/userinfo', (req, res) => {
  res.json({ name: '自夏', msg: '我在自夏 selfsummer' })
})

app.listen(4000, () => {
 console.log(`子服务启动成功`);
})

serve.js Mula-mula buat Perkhidmatan berbilang benang Ekspres

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

Bolehkah nod mendayakan multi-threading?

Anda boleh mengakses perkhidmatan utama Express dan alamat sub-perkhidmatan dengan jayanya

cluster.js Tukar perkhidmatan Ekspres kepada kluster

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  {
	    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
Bolehkah nod mendayakan multi-threading?

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 perkhidmatan Express kepada perkhidmatan http lalai

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)
Bolehkah nod mendayakan multi-threading?

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!

Kenyataan:
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