Artikel untuk membincangkan tentang pemproses berbilang nod dan berbilang benang

青灯夜游
Lepaskan: 2022-02-28 19:47:38
ke hadapan
3881 orang telah melayarinya

Artikel ini akan memperkenalkan anda kepada node.js, memperkenalkan berbilang proses dan berbilang benang dalam nod, dan membandingkan berbilang proses dan berbilang benang, saya harap ia akan membantu semua orang.

Artikel untuk membincangkan tentang pemproses berbilang nod dan berbilang benang

Berbilang proses dan berbilang benang dalam node.js

Dalam node.js, pelaksanaan kod javascript adalah tunggal -Pelaksanaan berulir, tetapi Node itu sendiri sebenarnya berbilang benang.

Artikel untuk membincangkan tentang pemproses berbilang nod dan berbilang benang

Nod itu sendiri terbahagi kepada tiga lapisan

Lapisan pertama , Pustaka standard Node .js, bahagian ini ditulis dalam Javascript, iaitu API yang boleh kita panggil terus semasa digunakan, yang boleh dilihat dalam direktori lib dalam kod sumber.

Lapisan kedua , Pengikatan Nod, lapisan ini adalah kunci untuk Javascript untuk berkomunikasi dengan C/C yang mendasari memanggil yang kedua melalui pengikatan dan bertukar-tukar data antara satu sama lain ialah lapisan pertama dan jambatan peringkat Ketiga.

Lapisan ketiga ialah kunci untuk menyokong operasi Node.js Ia dilaksanakan oleh C/C dan merupakan sebahagian daripada logik asas yang dilaksanakan oleh nod.

Antaranya, lapisan ketiga Libuv menyediakan Node.js dengan platform merentas, kumpulan benang, kumpulan acara, I/O tak segerak dan keupayaan lain, yang merupakan kunci untuk menjadikan Node.js begitu berkuasa.

Memandangkan Libuv menyediakan mekanisme gelung peristiwa, JavaScript tidak akan menyekat dalam pemprosesan io Oleh itu, apabila kami menggunakan nod untuk membina perkhidmatan web, kami tidak perlu risau tentang volum io yang berlebihan menyebabkan permintaan lain disekat.

Walau bagaimanapun, pelaksanaan tugasan bukan IO dilaksanakan dalam utas utama nod Ia adalah tugas pelaksanaan satu utas Jika terdapat tugas pengiraan segerak yang memakan masa menyekat pelaksanaan kod lain.

const Koa = require('koa');
const app = new Koa();

app.use(async (ctx) => {
    const url = ctx.request.url;
    if (url === '/') {
        ctx.body = {name: 'xxx', age: 14}
    }
    if(url==='/compute'){
        let sum=0
        for (let i = 0; i <100000000000 ; i++) {
        sum+=i    
        }
        ctx.body={sum}
    }
})
app.listen(4000, () => {
    console.log(&#39;http://localhost:4000/ start&#39;)
})
Salin selepas log masuk

Dalam kod di atas, jika permintaan http dibuat /compute, nod akan memanggil CPU untuk melakukan sejumlah besar pengiraan Pada masa ini, jika permintaan http lain masuk , penyekatan akan berlaku.

Jadi bagaimana untuk menyelesaikan masalah ini?

Terdapat dua penyelesaian, satu ialah menggunakan children_process atau cluster untuk membolehkan pengiraan berbilang proses, satu lagi menggunakan worker_thread untuk membolehkan berbilang benang untuk pengiraan

Berbilang proses vs berbilang benang

Bandingkan berbilang benang dan berbilang proses:

属性多进程多线程比较
数据数据共享复杂,需要用IPC;数据是分开的,同步简单因为共享进程数据,数据共享简单,同步复杂各有千秋
CPU、内存占用内存多,切换复杂,CPU利用率低占用内存少,切换简单,CPU利用率高多线程更好
销毁、切换创建销毁、切换复杂,速度慢创建销毁、切换简单,速度很快多线程更好
coding编码简单、调试方便编码、调试复杂编码、调试复杂
可靠性进程独立运行,不会相互影响线程同呼吸共命运多进程更好
分布式可用于多机多核分布式,易于扩展只能用于多核分布式多进程更好

Gunakan berbilang benang untuk menyelesaikan masalah pengiraan kod di atas:

//api.js
const Koa = require(&#39;koa&#39;);
const app = new Koa();

const {Worker} = require(&#39;worker_threads&#39;)
app.use(async (ctx) => {
    const url = ctx.request.url;
    if (url === &#39;/&#39;) {
        ctx.body = {name: &#39;xxx&#39;, age: 14}
    }

    if (url === &#39;/compute&#39;) {
        const sum = await new Promise(resolve => {
            const worker = new Worker(__dirname+&#39;/compute.js&#39;)
          //接收信息
            worker.on(&#39;message&#39;, data => {
                resolve(data)
            })
        })
        ctx.body = {sum}

    }
})
app.listen(4000, () => {
    console.log(&#39;http://localhost:4000/ start&#39;)
})



//computer.js
const {parentPort}=require(&#39;worker_threads&#39;)
let sum=0
for (let i = 0; i <1000000000 ; i++) {
    sum+=i
}
//发送信息
parentPort.postMessage(sum)
Salin selepas log masuk

Berikut ialah dokumentasi rasmi, worker_threads

https://nodejs.org/dist /latest-v16.x/docs/api/ worker_threads.html

Gunakan berbilang proses untuk menyelesaikan masalah pengiraan kod di atas:

//api.js
const Koa = require(&#39;koa&#39;);
const app = new Koa();
const {fork} = require(&#39;child_process&#39;)

app.use(async (ctx) => {
    const url = ctx.request.url;
    if (url === &#39;/&#39;) {
        ctx.body = {name: &#39;xxx&#39;, age: 14}
    }

    if (url === &#39;/compute&#39;) {
        const sum = await new Promise(resolve => {
          const worker =fork(__dirname+&#39;/compute.js&#39;)
            worker.on(&#39;message&#39;, data => {
                resolve(data)
            })
        })
        ctx.body = {sum}

    }
})
app.listen(4000, () => {
    console.log(&#39;http://localhost:4000/ start&#39;)
})

//computer.js
let sum=0
for (let i = 0; i <1000000000 ; i++) {
    sum+=i
}
process.send(sum)
Salin selepas log masuk

Berikut ialah dokumen rasmi, proses_kanak-kanak

https://nodejs.org/dist/latest-v16.x/docs/api/child_process.html

Untuk lebih banyak pengetahuan berkaitan nod, sila lawati: tutorial nodejs!

Atas ialah kandungan terperinci Artikel untuk membincangkan tentang pemproses berbilang nod dan berbilang benang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:juejin.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!