Analisis mendalam tentang Strim dalam Node
Apakah aliran? Bagaimana untuk memahami aliran? Artikel berikut akan memberi anda pemahaman yang mendalam tentang aliran dalam Nodejs, saya harap ia akan membantu anda!
strim ialah antara muka data abstrak, yang mewarisi EventEmitter Ia boleh menghantar/menerima data, dan intipatinya adalah untuk membiarkan data mengalir, seperti yang ditunjukkan di bawah:
Strim bukanlah konsep unik dalam Node, ia merupakan kaedah operasi paling asas dalam Linux | ia adalah Strim, tetapi ia dikapsulkan pada tahap Node dan menyediakan API yang sepadan
Mengapa anda perlu melakukannya sedikit demi sedikit?
Mula-mula gunakan kod berikut untuk mencipta fail, kira-kira 400MB [Cadangan tutorial berkaitan: tutorial video nodejs]
Apabila kami menggunakan readFile untuk membaca, kod berikut
Apabila perkhidmatan dimulakan seperti biasa, ia mengambil kira-kira 10MB memori
Apabila menggunakan curl http://127.0.0.1:8000
untuk memulakan permintaan, memori menjadi kira-kira 420MB, iaitu kira-kira saiz yang sama dengan fail yang kami cipta
Tukar kepada. menggunakan penulisan strim, kodnya adalah seperti berikut
Apabila permintaan dibuat semula, didapati memori hanya menduduki kira-kira 35MB, yang telah berkurangan dengan ketara berbanding readFile
Jika kita Jika anda tidak menggunakan mod penstriman dan menunggu fail besar dimuatkan sebelum beroperasi, masalah berikut akan berlaku:
- Memori digunakan terlalu banyak buat sementara waktu, menyebabkan sistem ranap
- Kelajuan operasi CPU adalah terhad Dan menyediakan berbilang program, fail besar terlalu besar dan mengambil masa yang lama untuk dimuatkan
Ringkasnya, membaca fail besar pada satu masa adalah terlalu banyak untuk memori dan rangkaian
Bagaimanakah kita boleh melakukannya sedikit demi sedikit?
Apabila kita membaca fail, kita boleh mengeluarkan data selepas bacaan selesai
Seperti yang dinyatakan di atas, strim mewarisi EventEmitter dan boleh dilaksanakan Monitor data. Mula-mula, tukar data bacaan kepada bacaan penstriman, gunakan on("data", ()⇒{})
untuk menerima data, dan akhirnya gunakan on("end", ()⇒{})
untuk mendapatkan hasil akhir
apabila data diserahkan . Cetuskan peristiwa data, terima data ini untuk diproses, dan akhirnya tunggu semua data dipindahkan dan mencetuskan peristiwa tamat.
Proses aliran data
Dari mana data berasal—sumber
Data mengalir dari satu tempat ke tempat lain, Mari kita lihat dahulu pada sumber data.
-
permintaan http, minta data daripada antara muka
-
konsol konsol, input standard stdin
fail fail, baca kandungan fail, seperti contoh di atas
Paip yang disambungkan— paip
Terdapat paip paip yang disambungkan dalam sumber dan tujuan. Kami tidak Anda perlu memantau data/peristiwa tamat secara manual seperti kod di atas.source.pipe(dest)
? Apakah sebenarnya data yang mengalir? Apakah bahagian dalam kod?
Ke mana hendak pergi—tuju
strim tiga kaedah output biasa
konsol konsol, stdout keluaran standard-
permintaan http, tindak balas dalam permintaan antara muka
-
fail fail, tulis fail
Jenis aliran
Strim Boleh Baca Strim Boleh Baca
Strim boleh dibaca ialah abstraksi sumber yang menyediakan data
Semua Boleh Baca melaksanakan antara muka yang ditakrifkan oleh strim.Kelas boleh dibaca
fail Baca penciptaan strim
fs.createReadStream Cipta objek Boleh Baca
Mod Baca
Strim boleh dibaca mempunyai dua mod, mod mengalir dan mod jeda, yang menentukan mod aliran data bongkah: aliran automatik dan Aliran aliran manual
Terdapat atribut _readableState dalam ReadableStream, di mana terdapat ialah atribut mengalir untuk menentukan mod aliran Ia mempunyai tiga nilai keadaan:
- tur: dinyatakan sebagai Mod aliran
- salah: Diwakili sebagai mod jeda
- null : Keadaan awal
Model pemanas air boleh digunakan untuk mensimulasikan aliran data . Tangki pemanas air (buffer cache) menyimpan air panas (data yang diperlukan Apabila kita membuka paip, air panas akan terus mengalir keluar dari tangki air, dan air paip akan terus mengalir ke dalam tangki air). mod aliran. Apabila kita mematikan paip, tangki air akan menjeda aliran masuk air dan paip akan menjeda keluaran air Ini ialah mod jeda.
Mod aliran
Data dibaca secara automatik dari lapisan bawah, membentuk fenomena aliran dan diberikan kepada aplikasi melalui peristiwa.
Anda boleh memasuki mod ini dengan mendengar peristiwa data
Apabila acara data ditambah, apabila terdapat data dalam strim boleh tulis, data akan ditolak ke acara fungsi panggil balik. Anda perlu melakukannya sendiri Untuk menggunakan blok data, data akan hilang jika tidak diproses-
Panggil kaedah stream.pipe untuk menghantar data kepada Boleh Tulis
-
Kaedah sambung panggilan
Mod jeda
Data. akan terkumpul dalam penimbal dalaman dan mesti dipanggil secara eksplisit strim.read() membaca blok data
-
mendengar acara yang boleh dibaca Strim boleh tulis akan mencetuskan panggilan balik peristiwa ini selepas data sedia Pada masa ini, anda perlu menggunakan stream.read() dalam fungsi panggil balik untuk menggunakan data secara aktif. Peristiwa boleh dibaca menunjukkan bahawa terdapat aktiviti baharu dalam strim: sama ada terdapat data baharu atau strim telah membaca semua data
Cara untuk teruskan antara dua mod Bagaimana pula dengan penukaran
Strim boleh dibaca berada dalam keadaan awal selepas penciptaan //TODO: tidak konsisten dengan perkongsian dalam talian
-
Tukar mod jeda kepada Mod aliran
- 监听 data 事件 - 调用 stream.resume 方法 - 调用 stream.pipe 方法将数据发送到 Writable
Salin selepas log masuk Mod aliran bertukar kepada mod jeda
- 移除 data 事件 - 调用 stream.pause 方法 - 调用 stream.unpipe 移除管道目标
Salin selepas log masuk
Prinsip pelaksanaan
Apabila mencipta aliran boleh dibaca, anda perlu mewarisi objek Boleh dibaca dan melaksanakan kaedah _baca
Buat strim boleh dibaca tersuai
Apabila kita memanggil kaedah baca, proses keseluruhannya adalah seperti berikut:
-
doRead
dalam aliran Cache dikekalkan untuk menentukan sama ada data perlu diminta daripada lapisan asas apabila kaedah baca dipanggil
Apabila panjang penimbal ialah 0 atau kurang daripada nilai highWaterMark, _read akan dipanggil untuk mendapatkan data dari lapisan bawahPautan kod sumber
Strim Boleh Tulis Strim
Strim boleh tulis ialah abstraksi destinasi penulisan data Ia digunakan untuk menggunakan data yang mengalir dari huluan dan memprosesnya melalui strim boleh tulis. Data ditulis ke peranti Strim tulis biasa sedang menulis ke cakera setempat
Ciri strim boleh tulis
-
Tulis data melalui tulis
-
Tulis data hingga akhir dan tutup strim, tamat = tulis + tutup
-
Apabila data bertulis mencapai saiz highWaterMark, peristiwa longkang akan dicetuskan
Panggil ws.write (chunk) mengembalikan palsu, menunjukkan bahawa data penimbal semasa adalah lebih besar daripada atau sama dengan nilai highWaterMark, dan peristiwa longkang akan dicetuskan. Malah, ia berfungsi sebagai amaran. Kami masih boleh menulis data, tetapi data yang tidak diproses akan sentiasa dilog masuk dalam penampan dalaman strim boleh tulis sehingga tunggakan diisi dengan penimbal Node.js diganggu secara paksa
Strim boleh tulis tersuai
Semua Boleh Tulis melaksanakan antara muka yang ditakrifkan oleh strim.Kelas boleh tulis
Anda sahaja perlu melaksanakan kaedah _write untuk menulis data ke lapisan asas
- Menulis data ke strim dengan memanggil kaedah writeable.write akan memanggil Kaedah _write menulis data ke lapisan bawah
- Apabila _write data berjaya, kaedah seterusnya perlu dipanggil untuk memproses data seterusnya
- Mesti call writable.end(data) To end aliran boleh tulis, data adalah pilihan. Selepas itu, tulis tidak boleh dipanggil untuk menambah data baharu, jika tidak, ralat akan dilaporkan
- Selepas kaedah penamat dipanggil, apabila semua operasi tulis asas selesai, acara penamat akan dicetuskan
Strim Dupleks Strim Dupleks
Strim Dupleks, yang boleh dibaca dan ditulis. Malah, ia adalah strim yang mewarisi Boleh Dibaca dan Boleh Ditulis, jadi ia boleh digunakan sebagai strim boleh dibaca dan strim boleh ditulis
Strim dupleks tersuai perlu melaksanakan kaedah _read of Readable dan The _write method of Boleh ditulis
modul bersih boleh digunakan untuk mencipta soket Soket ialah Dupleks biasa dalam NodeJS Lihat contoh klien TCP
klien ialah Dupleks Strim boleh tulis digunakan untuk menghantar mesej kepada pelayan, dan strim boleh dibaca digunakan untuk menerima mesej pelayan Tiada hubungan langsung antara data dalam dua aliran
Transform Stream
Dalam contoh di atas, data dalam strim boleh dibaca (0/1) dan data dalam strim boleh tulis ('F', 'B', ' B') diasingkan, dan tidak ada hubungan antara kedua-duanya, tetapi untuk Transform, data yang ditulis pada bahagian boleh tulis akan ditambah secara automatik ke bahagian yang boleh dibaca selepas transformasi.
Transform mewarisi daripada Duplex dan telah pun melaksanakan kaedah _write dan _read Anda hanya perlu melaksanakan kaedah _tranform
gup Automasi berasaskan Stream Untuk membina. alat itu, lihat contoh kod daripada tapak web rasmi
kurang → kurangkan tukar kepada css → lakukan pemampatan css → css termampat
Malah, kurang () dan minifyCss() melakukan beberapa pemprosesan pada data input, dan kemudian menyerahkannya kepada data output
Pemilihan Dupleks dan Transformasi
Berbanding dengan contoh di atas, kami mendapati bahawa apabila strim memberi perkhidmatan kepada pengeluar dan pengguna, kami akan memilih Dupleks, dan apabila kami hanya melakukan beberapa kerja transformasi pada data, kami akan memilih untuk menggunakan Tranform
Masalah tekanan belakang
Apakah tekanan belakang
Masalah tekanan belakang datang daripada pemprosesan pengguna dalam model pengguna pengeluar Kepantasan adalah terlalu perlahan
Sebagai contoh, semasa proses muat turun kami, kelajuan pemprosesan ialah 3Mb/s, manakala semasa proses pemampatan, kelajuan pemprosesan ialah 1Mb/s. Dalam kes ini, baris gilir penimbal akan terkumpul tidak lama lagi 🎜>
Sama ada penggunaan memori bagi keseluruhan proses meningkat, atau keseluruhan penimbal perlahan dan beberapa data hilangApakah itu pemprosesan tekanan belakangApabila pemprosesan muat turun menerima mesej, ia akan berhenti menghantar data ke bawah
Bagaimana untuk menangani tekanan belakang
Kami mempunyai fungsi yang berbeza untuk memindahkan data dari satu proses ke proses yang lain. Dalam Node.js, terdapat fungsi terbina dalam dipanggil .pipe(), dan akhirnya, pada tahap asas dalam proses ini kita mempunyai dua komponen yang tidak berkaitan: sumber data dan pengguna
Apabila . pipe() dipanggil oleh sumber, ia memberitahu pengguna bahawa terdapat data yang akan dipindahkan. Fungsi saluran paip mewujudkan pakej tunggakan yang sesuai untuk mencetuskan peristiwaApabila cache data melebihi highWaterMark atau baris gilir penulisan sibuk, .write() akan mengembalikan false
Apabila false kembali, Sistem backlog melangkah masuk. Ia akan menjeda Boleh Baca masuk daripada mana-mana aliran data yang menghantar data. Setelah strim data dikosongkan, peristiwa longkang akan dicetuskan dan aliran data masuk
akan digunakan Sebaik sahaja baris gilir diproses sepenuhnya, mekanisme tunggakan akan membenarkan data dihantar semula. Ruang memori yang digunakan akan melepaskan dirinya dan bersedia untuk menerima kumpulan data seterusnya
Kita dapat melihat pemprosesan tekanan belakang paip:Bahagikan data kepada ketulan dan tulis
- Untuk lebih banyak pengetahuan berkaitan nod, sila lawati:
- tutorial nodejs !
Atas ialah kandungan terperinci Analisis mendalam tentang Strim dalam Node. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

PHP dan Vue: gandingan sempurna alat pembangunan bahagian hadapan Dalam era perkembangan pesat Internet hari ini, pembangunan bahagian hadapan telah menjadi semakin penting. Memandangkan pengguna mempunyai keperluan yang lebih tinggi dan lebih tinggi untuk pengalaman tapak web dan aplikasi, pembangun bahagian hadapan perlu menggunakan alat yang lebih cekap dan fleksibel untuk mencipta antara muka yang responsif dan interaktif. Sebagai dua teknologi penting dalam bidang pembangunan bahagian hadapan, PHP dan Vue.js boleh dianggap sebagai alat yang sempurna apabila digandingkan bersama. Artikel ini akan meneroka gabungan PHP dan Vue, serta contoh kod terperinci untuk membantu pembaca memahami dan menggunakan kedua-dua ini dengan lebih baik.

Dalam temu bual pembangunan bahagian hadapan, soalan lazim merangkumi pelbagai topik, termasuk asas HTML/CSS, asas JavaScript, rangka kerja dan perpustakaan, pengalaman projek, algoritma dan struktur data, pengoptimuman prestasi, permintaan merentas domain, kejuruteraan bahagian hadapan, corak reka bentuk, dan teknologi dan trend baharu. Soalan penemuduga direka bentuk untuk menilai kemahiran teknikal calon, pengalaman projek dan pemahaman tentang trend industri. Oleh itu, calon harus bersedia sepenuhnya dalam bidang ini untuk menunjukkan kebolehan dan kepakaran mereka.

Dengan perkembangan teknologi Internet, pembangunan front-end telah menjadi semakin penting. Terutamanya populariti peranti mudah alih memerlukan teknologi pembangunan bahagian hadapan yang cekap, stabil, selamat dan mudah diselenggara. Sebagai bahasa pengaturcaraan yang berkembang pesat, bahasa Go telah digunakan oleh semakin ramai pembangun. Jadi, adakah boleh menggunakan bahasa Go untuk pembangunan bahagian hadapan? Seterusnya, artikel ini akan menerangkan secara terperinci cara menggunakan bahasa Go untuk pembangunan bahagian hadapan. Mari kita lihat dahulu mengapa bahasa Go digunakan untuk pembangunan bahagian hadapan. Ramai orang berpendapat bahawa bahasa Go ialah a

Django ialah rangka kerja aplikasi web yang ditulis dalam Python yang menekankan pembangunan pesat dan kaedah bersih. Walaupun Django ialah rangka kerja web, untuk menjawab soalan sama ada Django ialah front-end atau back-end, anda perlu mempunyai pemahaman yang mendalam tentang konsep front-end dan back-end. Bahagian hadapan merujuk kepada antara muka yang pengguna berinteraksi secara langsung, dan bahagian belakang merujuk kepada program bahagian pelayan Mereka berinteraksi dengan data melalui protokol HTTP. Apabila bahagian hadapan dan bahagian belakang dipisahkan, program bahagian hadapan dan bahagian belakang boleh dibangunkan secara bebas untuk melaksanakan logik perniagaan dan kesan interaktif masing-masing, dan pertukaran data.

Golang boleh digunakan sebagai front-end Golang adalah bahasa pengaturcaraan yang sangat serba boleh yang boleh digunakan untuk membangunkan pelbagai jenis aplikasi, termasuk aplikasi front-end Dengan menggunakan Golang untuk menulis front-end, anda boleh menyingkirkan a siri masalah yang disebabkan oleh bahasa seperti JavaScript Contohnya, masalah seperti keselamatan jenis yang lemah, prestasi rendah dan sukar untuk mengekalkan kod.

Sebagai pembangun C#, kerja pembangunan kami biasanya merangkumi pembangunan bahagian hadapan dan bahagian belakang Apabila teknologi berkembang dan kerumitan projek meningkat, pembangunan kolaboratif bahagian hadapan dan bahagian belakang menjadi semakin penting dan kompleks. Artikel ini akan berkongsi beberapa teknik pembangunan kolaboratif bahagian hadapan dan belakang untuk membantu pembangun C# menyelesaikan kerja pembangunan dengan lebih cekap. Selepas menentukan spesifikasi antara muka, pembangunan kolaboratif bahagian hadapan dan belakang tidak dapat dipisahkan daripada interaksi antara muka API. Untuk memastikan pembangunan kolaboratif bahagian hadapan dan belakang yang lancar, perkara yang paling penting ialah menentukan spesifikasi antara muka yang baik. Spesifikasi antara muka melibatkan nama antara muka

Apakah itu ESM bahagian hadapan? Contoh kod khusus diperlukan Dalam pembangunan bahagian hadapan, ESM merujuk kepada ECMAScriptModules, kaedah pembangunan modular berdasarkan spesifikasi ECMAScript. ESM membawa banyak faedah, seperti organisasi kod yang lebih baik, pengasingan antara modul dan kebolehgunaan semula. Artikel ini akan memperkenalkan konsep asas dan penggunaan ESM dan menyediakan beberapa contoh kod khusus. Konsep asas ESM Dalam ESM, kita boleh membahagikan kod kepada berbilang modul, dan setiap modul mendedahkan beberapa antara muka untuk modul lain kepada

Kaedah untuk melaksanakan pemesejan segera termasuk WebSocket, Tinjauan Panjang, Acara Dihantar Pelayan, WebRTC, dsb. Pengenalan terperinci: 1. WebSocket, yang boleh mewujudkan sambungan berterusan antara pelanggan dan pelayan untuk mencapai komunikasi dua hala masa nyata Bahagian hadapan boleh menggunakan API WebSocket untuk membuat sambungan WebSocket dan mencapai pemesejan segera dengan menghantar dan menerima. mesej; 2. Long Polling, teknologi yang menyerupai komunikasi masa nyata, dsb.
