Dalam nodej, "I/O" bermaksud input dan output, biasanya menunjukkan operasi "I/O" boleh dibahagikan kepada pelaksanaan bersiri satu-benang dan pelaksanaan selari berbilang benang. , pemasangan berbenang tunggal dilaksanakan secara berurutan, sebarang kelambatan dalam pelaksanaan akan menyebabkan kod pelaksanaan seterusnya disekat.
Persekitaran pengendalian artikel ini: sistem Windows 10, nodejs versi 12.19.0, komputer Dell G3.
Ramai orang biasa dengan pelayan Nginx ditulis dalam C tulen dan digunakan sebagai pelayan web dan dalam proksi terbalik kelebihan dari segi perkhidmatan seperti load balancing dan sebagainya. Pelayan Node dan Nginx adalah serupa kerana ia didorong oleh peristiwa.
JavaScript dalam penyemak imbas dilaksanakan pada satu utas, dan ia juga berkongsi urutan yang sama dengan pemaparan UI Apabila JavaScript dilaksanakan, pemaparan UI dan respons harus berada dalam keadaan bertakung. (Jika masa pelaksanaan skrip melebihi 100 milisaat, pengguna akan merasakan halaman tersekat). Apabila menghadapi situasi ini, kami akan memikirkan kaedah tak segerak untuk menghapuskan masalah menunggu ini, dan kami tidak akan memperkenalkan konsep tak segerak dan segerak.
Seterusnya, mari kita lihat dengan lebih dekat ciri I/O NodeJS yang dipacu peristiwa dan tidak menyekat. Memahami perkara ini akan mempunyai kepentingan yang lebih mendalam untuk kita mempelajari pembangunan NodeJS dengan lebih baik dan membina Web berprestasi tinggi. platform.
1 Gambaran keseluruhan operasi I/O:
Operasi I/O sudah biasa kepada mana-mana pembangun Sekarang mari kita bincangkan secara ringkas tentang operasi NodeJS I.O. Operasi I/O dibahagikan kepada: perlaksanaan bersiri berbilang benang; Kedua-dua kaedah mempunyai kelebihan dan kekurangannya sendiri Kos berbilang benang ialah kos tinggi untuk penciptaan benang dan penukaran konteks benang semasa pelaksanaan, dan masalah penyegerakan muka berbilang benang. Pemasangan berbenang tunggal dilaksanakan secara berurutan Sebarang kelambatan dalam pelaksanaan akan menyebabkan kod pelaksanaan seterusnya disekat. Perihalan pelaksanaan bersiri tugas (konsepnya serupa dengan pelaksanaan segerak) dan pelaksanaan tugasan selari adalah seperti berikut:
Gunakan utas tunggal dalam NodeJS untuk menjauhi kebuntuan , Nyatakan isu penyegerakan, gunakan I/O tak segerak untuk menjauhkan benang tunggal daripada disekat, supaya dapat menggunakan CPU dengan lebih baik. I/O tak segerak menjangkakan bahawa panggilan I/O tidak lagi menyekat operasi berikutnya dan memperuntukkan masa menunggu asal untuk penyiapan I/O kepada perniagaan lain yang diperlukan untuk dilaksanakan.
Banyak kali sesetengah pembangun keliru tentang konsep asynchronous/synchronous dan blocking/non-blocking, dan kedua-duanya tidak berkaitan. Menyekat I/O bermakna selepas membuat panggilan, anda mesti menunggu sehingga tahap kernel sistem melengkapkan semua operasi sebelum panggilan tamat. I/O yang tidak menyekat kembali serta-merta selepas dipanggil. Mengenai menyekat I/O dan tidak menyekat I/O, terdapat rajah berikut:
2 analisis I/O tak segerak NodeJS:
Gelung peristiwa: Apabila proses bermula, Node akan mencipta gelung yang serupa dengan while(true) Proses setiap pelaksanaan badan gelung dipanggil Tick Proses setiap Tick adalah untuk menyemak sama ada ada masa untuk diproses.
Pemerhati: Terdapat satu atau lebih pemerhati dalam setiap gelung masa Proses menentukan sama ada terdapat peristiwa yang perlu diproses adalah untuk bertanya kepada pemerhati ini sama ada terdapat peristiwa yang perlu diproses.
Objek permintaan: Dalam proses peralihan daripada JavaScript yang memulakan panggilan ke kernel yang melengkapkan operasi I/O, terdapat produk perantaraan, iaitu objek permintaan.
Kumpulan utas I/O: Kumpul permintaan, hantarkannya ke kumpulan utas I/O untuk pelaksanaan, lengkapkan langkah pertama operasi I/O dan masukkan bahagian kedua pemberitahuan panggil balik. (Dalam Windows, selepas operasi I/O dalam kumpulan benang dipanggil, hasil yang diperoleh akan disimpan dalam atribut req->result, dan kemudian PostQueuedCompletionStatus() akan dipanggil untuk memberitahu IOCP bahawa operasi objek semasa telah selesai.)
I/O tak segerak mempunyai angka berikut:
Contoh pengaturcaraan tak segerak NodeJS:
Async Saya telah diperkenalkan sebelum ini konsep berkaitan /O, berikut ialah contoh operasi I/O tak segerak:
var config = require('./config.json'); var fs = require("fs"); var http = require('http'); var url_module = require("url"); http.createServer(function (request, response) { var key = url_module.parse(request.url).query.replace('key=', ''); switch (request.method) { case 'GET': // Asynchronous Response Generation fs.readFile(config.dataPath + key, 'utf8', function(err, value) { if (err) { // Return File Not Found if file hasn't yet been created response.writeHead(404, {'Content-Type': 'text/plain'}); response.end("The file (" + config.dataPath + key + ") does not yet exist."); } else { // If the file exists, read it and return the sorted contents var sorted = value.split(config.sortSplitString).sort().join(''); response.writeHead(200, {'Content-Type': 'text/plain'}); response.end(sorted); } }); break; case 'POST': // Synchronously append POSTed data to a file var postData = ''; request .on('data', function (data) { postData += data; }) .on('end', function () { fs.appendFile(config.dataPath + key, postData, function(err) { if (err) { // Return error if unable to create/append to the file response.writeHead(400, {'Content-Type': 'text/plain'}); response.end('Error: Unable to write file: ' + err); } else { // Write or append posted data to a file, return "success" response response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('success'); } }); }); break; default: response.writeHead(400, {'Content-Type': 'text/plain'}); response.end("Error: Bad HTTP method: " + request.method); } }).listen(config.serverPort); console.log('synchronous server is running: ', config.serverPort);
Pembelajaran yang disyorkan: "tutorial video nodejs"
Atas ialah kandungan terperinci Apakah maksud I/O dalam nodejs. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!