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ư
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
- có thể đọc được. here is the lines only used to read
- Có thể ghi. here is the lines only used to write
- song công. used both 2 read and write
- 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ư sauhocweb.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];
}];
2const 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];
}];
5const 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ố 8Lú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.vn0
Đ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.vn2
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.vn3
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ồngGiả 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];
}];
0Kế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];
}];
1Kế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