Nút zlib

Luồng trong NodeJS là gì ?

Streamstrong NodeJS là một bộ sưu tập dữ liệu giống như chuỗi hoặc mảng, sự khác biệt duy nhất là các luồng không tồn tại cùng một lúc. Điều khiến các luồng thực sự mạnh đó là khả năng làm việc khi xử lý dữ liệu lớn (dữ liệu lớn) hoặc nguồn dữ liệu đến từ các nguồn bên ngoài

Nội dung chính Hiển thị

  • Luồng trong NodeJS là gì ?
  • Chế độ đối tượng trong Luồng NodeJS
  • Thao tác với Stream trong NodeJS
  • Read data with Streams
  • Ghi dữ liệu với Streams
  • Thuật toán Piping Stream trong Node. js
  • Kỹ thuật Piping Chaining trong Node. js
  • Một số ví dụ về Streams trong NodeJS
  • Ghi tệp dữ liệu lớn để sử dụng Luồng
  • Read file data to use Streams
  • Kết luận

Các luồng không chỉ dừng lại ở công việc lý dữ liệu, nó còn có khả năng quay lại khả năng kết hợp mã một cách tuyệt vời, giống như khi kết hợp các câu lệnh lunix với nhau thành một câu lệnh xử lý duy nhất

Có rất nhiều mô-đun của Nodejs thực thi dựa trên hơi hướng của các luồng như

Nút zlib

Các luồng cho phép bạn đọc dữ liệu từ một nguồn hoặc ghi dữ liệu tới một đích đến. Trong NodeJS, có 4 loại luồng khác nhau

  1. có thể đọc được. here is the lines only used to read
  2. Có thể ghi. here is the lines only used to write
  3. song công. used both 2 read and write
  4. Biến đổi. a type of Duplex but other nhau do kết quả của đầu ra dựa vào đầu vào

Mỗi luồng đều được cấp một EventEmitter cho phép chúng ta bắt sự kiện theo từng điểm cụ thể. Sau đây là một vài sự khác biệt hay sử dụng

  • dữ liệu. this event has been activate when data is read
  • chấm dứt. this event has been activate when not also data to read
  • lỗi. this event is being activate khi xảy ra lỗi
  • kết thúc. this event has been activate when complete

Chế độ đối tượng trong Luồng NodeJS

Tất cả các luồng được tạo bởi API Nodejs đều được hoạt động trên các đối tượng kiểu chuỗi và Bộ đệm (hoặc Uint8Array). Tuy nhiên, dòng đôi khi làm việc với các loại giá trị khác nhau của Javascript (ngoại trừ giá trị null)

Bởi vì vậy chế độ đối tượng chế độ được thêm vào, để sử dụng, bạn cần phải chuyển chế độ đối tượng sang chế độ khi bắt đầu tạo luồng. Việc chuyển các luồng đã được khởi tạo sang chế độ đối tượng là không hoàn toàn với dữ liệu

Thao tác với Stream trong NodeJS

Luồng là một chức năng rất mạnh trong Nodejs, hãy tưởng tượng khi bạn làm việc với dữ liệu trực tiếp thì bạn cần phải có một vùng nhớ đủ lớn để lưu trữ nó. Giả sử chúng ta có một file text 10GB mà trong khi đó server của bạn chỉ có 1GB Ram, để đọc file này ngay thì server sẽ không thể thực hiện được vì thiếu bộ nhớ. Luồng cho phép chúng ta đọc dữ liệu lớn bằng cách chia nhỏ dữ liệu ra và đọc giá trị theo từng phần

Read data with Streams

Chúng ta có tệp dữ liệu dạng văn bản ở tệp 

const fs = require("fs");
let data = '';
// Đọc file bằng streams bằng phương thức createReadStream
const readerStream = fs.createReadStream('input.txt');
// Kiểu mã hóa dùng là UTF8
readerStream.setEncoding('UTF8');
// Sự kiện khi đọc data
readerStream.on('data', function(chunk) {
   data += chunk;
});
//Khi kết thúc đọc data và in ra nội dung đã đọc
readerStream.on('end',function(){
   console.log(data)
});
//Khi xảy ra lỗi in ra lỗi
readerStream.on('error', function(err){
   console.log(err.stack);
});
2 như sau

hocweb.vn

Tạo tệp 

const fs = require("fs");
let data = '';
// Đọc file bằng streams bằng phương thức createReadStream
const readerStream = fs.createReadStream('input.txt');
// Kiểu mã hóa dùng là UTF8
readerStream.setEncoding('UTF8');
// Sự kiện khi đọc data
readerStream.on('data', function(chunk) {
   data += chunk;
});
//Khi kết thúc đọc data và in ra nội dung đã đọc
readerStream.on('end',function(){
   console.log(data)
});
//Khi xảy ra lỗi in ra lỗi
readerStream.on('error', function(err){
   console.log(err.stack);
});
3và khai báo sử dụng mô-đun fs,và sử dụng phương thức createReadStream() tham số là đường dẫn tệp bạn muốn đọc ở đây là 
const fs = require("fs");
let data = '';
// Đọc file bằng streams bằng phương thức createReadStream
const readerStream = fs.createReadStream('input.txt');
// Kiểu mã hóa dùng là UTF8
readerStream.setEncoding('UTF8');
// Sự kiện khi đọc data
readerStream.on('data', function(chunk) {
   data += chunk;
});
//Khi kết thúc đọc data và in ra nội dung đã đọc
readerStream.on('end',function(){
   console.log(data)
});
//Khi xảy ra lỗi in ra lỗi
readerStream.on('error', function(err){
   console.log(err.stack);
});
2

const fs = require("fs");
let data = '';
// Đọc file bằng streams bằng phương thức createReadStream
const readerStream = fs.createReadStream('input.txt');
// Kiểu mã hóa dùng là UTF8
readerStream.setEncoding('UTF8');
// Sự kiện khi đọc data
readerStream.on('data', function(chunk) {
   data += chunk;
});
//Khi kết thúc đọc data và in ra nội dung đã đọc
readerStream.on('end',function(){
   console.log(data)
});
//Khi xảy ra lỗi in ra lỗi
readerStream.on('error', function(err){
   console.log(err.stack);
});

Open terminal and run command line to view results

node readStream.js

Ghi dữ liệu với Streams

Với NodeJS, để ghi tệp từ luồng chúng ta sử dụng phương thức createWriteStream() trong mô-đun fs. Tạo tệp 

const fs = require("fs");
let data = '';
// Đọc file bằng streams bằng phương thức createReadStream
const readerStream = fs.createReadStream('input.txt');
// Kiểu mã hóa dùng là UTF8
readerStream.setEncoding('UTF8');
// Sự kiện khi đọc data
readerStream.on('data', function(chunk) {
   data += chunk;
});
//Khi kết thúc đọc data và in ra nội dung đã đọc
readerStream.on('end',function(){
   console.log(data)
});
//Khi xảy ra lỗi in ra lỗi
readerStream.on('error', function(err){
   console.log(err.stack);
});
5

const fs = require("fs");
let data = 'hocweb.vn';
//Sử dụng phương thức createWriteStream
const writerStream = fs.createWriteStream('output.txt');
// Ghi dữ liệu vào file
writerStream.write(data);
// Đánh dấu đây là cuối file
writerStream.end();
// Bắt sự kiện finish của Streams
writerStream.on('finish', function() {
    console.log("Write done.");
});
// Bắt sự kiện error khi xảy ra lỗi
writerStream.on('error', function(err){
   console.log(err.stack);
});

Open terminal and chay line command

________số 8

Lúc này chúng ta sẽ nhận được 1 tệp mới có tên đầu ra. txt có nội dung

hocweb.vn

Thuật toán Piping Stream trong Node. js

Trong 2 phần trước chúng ta đã tìm hiểu về cách đọc và ghi tệp sử dụng Luồng. Trong Luồng ta còn có một khái niệm khác nữa đó là Piping (đường ống) cho phép chúng ta lấy dữ liệu đầu ra từ một luồng làm đầu vào các luồng khác. Nó hoạt động như một đường ống giúp chuyển dữ liệu giữa các luồng với nhau

Trong ví dụ này, chúng tôi lấy dữ liệu của đầu vào tệp. txt làm dữ liệu đầu vào cho đầu ra tệp. txt bằng cách tạo 2 luồng và kết nối với nhau bằng ống phương thức

hocweb.vn
0

Đoạn mã hành động thất bại trên ta sẽ cho kết quả ở đầu ra tệp. txt

hocweb.vn

Kỹ thuật Piping Chaining trong Node. js

Piping Chaining là kỹ thuật để kết nối đầu ra của các luồng lại với nhau, nối đầu ra của luồng này với luồng khác tạo thành một chuỗi bao gồm nhiều luồng. Nó được sử dụng với cách hoạt động của đường ống. Chúng ta sử dụng kỹ thuật này để lấy đầu ra của một tệp, nén nó lại sau đó tiến trình ghi tệp nén đó ra trong NodeJS

hocweb.vn
2

Khi chạy chương trình trên, chương trình sẽ lấy đầu ra của tệp đầu vào. txt để nén tệp sau đó sẽ tạo ra một tệp nén mới có tên đầu ra. txt. gz. Đây là một kỹ thuật được sử dụng khá nhiều

Một số ví dụ về Streams trong NodeJS

Nếu như phần trên chúng ta tìm hiểu về các thao tác với stream thì trong phần này mình sẽ đưa ra một số ví dụ để chứng minh sức mạnh của Streams trong việc xử lý dữ liệu

Ghi tệp dữ liệu lớn để sử dụng Luồng

Đối với công việc ghi tệp lớn hơn một cách thông thường, bạn cần phải sử dụng rất nhiều bộ nhớ để xử lý công việc ghi tệp. Nhưng đối với các luồng công việc ghi tệp dữ liệu lớn không quá nhiều bộ nhớ

hocweb.vn
3

Khi bạn ghi tệp bằng các luồng, nó sẽ ghi vào tệp theo từng đoạn (chunk)

Read file data to use Streams

Chúng ta có một tệp vài GB, nếu bạn đọc thông thường thì máy chủ sẽ quá tải. Cách thức hoạt động của các luồng trong tệp đọc lớn là sẽ chia đọc theo từng phần. Khái niệm 

const fs = require("fs");
let data = '';
// Đọc file bằng streams bằng phương thức createReadStream
const readerStream = fs.createReadStream('input.txt');
// Kiểu mã hóa dùng là UTF8
readerStream.setEncoding('UTF8');
// Sự kiện khi đọc data
readerStream.on('data', function(chunk) {
   data += chunk;
});
//Khi kết thúc đọc data và in ra nội dung đã đọc
readerStream.on('end',function(){
   console.log(data)
});
//Khi xảy ra lỗi in ra lỗi
readerStream.on('error', function(err){
   console.log(err.stack);
});
6 là kích thước dữ liệu của mỗi đoạn khi trong luồng

Giả sử dung lượng của tệp

const fs = require("fs");
let data = '';
// Đọc file bằng streams bằng phương thức createReadStream
const readerStream = fs.createReadStream('input.txt');
// Kiểu mã hóa dùng là UTF8
readerStream.setEncoding('UTF8');
// Sự kiện khi đọc data
readerStream.on('data', function(chunk) {
   data += chunk;
});
//Khi kết thúc đọc data và in ra nội dung đã đọc
readerStream.on('end',function(){
   console.log(data)
});
//Khi xảy ra lỗi in ra lỗi
readerStream.on('error', function(err){
   console.log(err.stack);
});
7 là 40GB, nếu đọc tệp theo cách thông thường sẽ mất khá nhiều dung lượng bộ nhớ

const fs = require("fs");
let data = '';
// Đọc file bằng streams bằng phương thức createReadStream
const readerStream = fs.createReadStream('input.txt');
// Kiểu mã hóa dùng là UTF8
readerStream.setEncoding('UTF8');
// Sự kiện khi đọc data
readerStream.on('data', function(chunk) {
   data += chunk;
});
//Khi kết thúc đọc data và in ra nội dung đã đọc
readerStream.on('end',function(){
   console.log(data)
});
//Khi xảy ra lỗi in ra lỗi
readerStream.on('error', function(err){
   console.log(err.stack);
});
0

Kết quả

còn đây là đọc tệp sử dụng luồng

const fs = require("fs");
let data = '';
// Đọc file bằng streams bằng phương thức createReadStream
const readerStream = fs.createReadStream('input.txt');
// Kiểu mã hóa dùng là UTF8
readerStream.setEncoding('UTF8');
// Sự kiện khi đọc data
readerStream.on('data', function(chunk) {
   data += chunk;
});
//Khi kết thúc đọc data và in ra nội dung đã đọc
readerStream.on('end',function(){
   console.log(data)
});
//Khi xảy ra lỗi in ra lỗi
readerStream.on('error', function(err){
   console.log(err.stack);
});
1

Kết luận

Qua bài viết, bạn đã hiểu về Stream và cách sử dụng hiệu quả. Hãy áp dụng vào dự án, ứng dụng của bản thân để tận dụng tối đa