ದಕ್ಷ ಸ್ಟ್ರೀಮ್ ಪ್ರೊಸೆಸಿಂಗ್ಗಾಗಿ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳನ್ನು ಅನ್ವೇಷಿಸಿ. ಅಸಮಕಾಲಿಕ ಡೇಟಾವನ್ನು ನಿರ್ವಹಿಸಲು ಸುಧಾರಿತ ಮಾದರಿಗಳನ್ನು ರಚಿಸುವುದು, ಬಳಸುವುದನ್ನು ಕಲಿಯಿರಿ.
ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳು: ಸ್ಟ್ರೀಮ್ ಪ್ರೊಸೆಸಿಂಗ್ ಮಾದರಿಗಳಲ್ಲಿ ಪಾಂಡಿತ್ಯ
ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳು ಅಸಮಕಾಲಿಕ ಡೇಟಾ ಸ್ಟ್ರೀಮ್ಗಳನ್ನು ಸಮರ್ಥವಾಗಿ ನಿರ್ವಹಿಸಲು ಒಂದು ಶಕ್ತಿಯುತ ವ್ಯವಸ್ಥೆಯನ್ನು ಒದಗಿಸುತ್ತವೆ. ಅವು ಅಸಮಕಾಲಿಕ ಪ್ರೋಗ್ರಾಮಿಂಗ್ನ ಸಾಮರ್ಥ್ಯಗಳನ್ನು ಇಟರೇಟರ್ಗಳ ಸೊಬಗಿನೊಂದಿಗೆ ಸಂಯೋಜಿಸುತ್ತವೆ, ಮುಖ್ಯ ಥ್ರೆಡ್ ಅನ್ನು ಬ್ಲಾಕ್ ಮಾಡದೆ ಡೇಟಾ ಲಭ್ಯವಾದಂತೆ ಅದನ್ನು ಪ್ರೊಸೆಸ್ ಮಾಡಲು ನಿಮಗೆ ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ. ದೊಡ್ಡ ಡೇಟಾಸೆಟ್ಗಳು, ನೈಜ-ಸಮಯದ ಡೇಟಾ ಫೀಡ್ಗಳು ಮತ್ತು ಸಂಕೀರ್ಣ ಡೇಟಾ ರೂಪಾಂತರಗಳನ್ನು ಒಳಗೊಂಡ ಸನ್ನಿವೇಶಗಳಿಗೆ ಈ ವಿಧಾನವು ವಿಶೇಷವಾಗಿ ಉಪಯುಕ್ತವಾಗಿದೆ.
ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳು ಮತ್ತು ಅಸಿಂಕ್ ಇಟರೇಟರ್ಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವುದು
ಸ್ಟ್ರೀಮ್ ಪ್ರೊಸೆಸಿಂಗ್ ಮಾದರಿಗಳಿಗೆ ಧುಮುಕುವ ಮೊದಲು, ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳು ಮತ್ತು ಅಸಿಂಕ್ ಇಟರೇಟರ್ಗಳ ಮೂಲಭೂತ ಪರಿಕಲ್ಪನೆಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವುದು ಅತ್ಯಗತ್ಯ.
ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳು ಎಂದರೇನು?
ಅಸಿಂಕ್ ಜೆನರೇಟರ್ ಎನ್ನುವುದು ಒಂದು ವಿಶೇಷ ರೀತಿಯ ಫಂಕ್ಷನ್ ಆಗಿದ್ದು, ಅದನ್ನು ವಿರಾಮಗೊಳಿಸಬಹುದು ಮತ್ತು ಪುನರಾರಂಭಿಸಬಹುದು, ಇದು ಮೌಲ್ಯಗಳನ್ನು ಅಸಮಕಾಲಿಕವಾಗಿ ನೀಡಲು ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದನ್ನು async function*
ಸಿಂಟ್ಯಾಕ್ಸ್ ಬಳಸಿ ವ್ಯಾಖ್ಯಾನಿಸಲಾಗಿದೆ. ಸಾಮಾನ್ಯ ಜೆನರೇಟರ್ಗಳಿಗಿಂತ ಭಿನ್ನವಾಗಿ, ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳು ಜೆನರೇಟರ್ ಫಂಕ್ಷನ್ನೊಳಗೆ ಅಸಮಕಾಲಿಕ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ನಿರ್ವಹಿಸಲು await
ಅನ್ನು ಬಳಸಬಹುದು.
ಉದಾಹರಣೆ:
async function* generateSequence(start, end) {
for (let i = start; i <= end; i++) {
await new Promise(resolve => setTimeout(resolve, 500)); // Simulate asynchronous delay
yield i;
}
}
ಈ ಉದಾಹರಣೆಯಲ್ಲಿ, generateSequence
ಒಂದು ಅಸಿಂಕ್ ಜೆನರೇಟರ್ ಆಗಿದ್ದು, ಅದು start
ನಿಂದ end
ವರೆಗಿನ ಸಂಖ್ಯೆಗಳ ಅನುಕ್ರಮವನ್ನು ನೀಡುತ್ತದೆ, ಪ್ರತಿ ಸಂಖ್ಯೆಯ ನಡುವೆ 500ms ವಿಳಂಬವಿರುತ್ತದೆ. await
ಕೀವರ್ಡ್, ಪ್ರಾಮಿಸ್ ಪರಿಹಾರವಾಗುವವರೆಗೆ (ಅಸಮಕಾಲಿಕ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ಅನುಕರಿಸುತ್ತದೆ) ಜೆನರೇಟರ್ ವಿರಾಮಗೊಳ್ಳುವುದನ್ನು ಖಚಿತಪಡಿಸುತ್ತದೆ.
ಅಸಿಂಕ್ ಇಟರೇಟರ್ಗಳು ಎಂದರೇನು?
ಅಸಿಂಕ್ ಇಟರೇಟರ್ ಎನ್ನುವುದು ಅಸಿಂಕ್ ಇಟರೇಟರ್ ಪ್ರೋಟೋಕಾಲ್ಗೆ ಅನುಗುಣವಾಗಿರುವ ಒಂದು ಆಬ್ಜೆಕ್ಟ್ ಆಗಿದೆ. ಇದು next()
ಮೆಥಡ್ ಅನ್ನು ಹೊಂದಿದ್ದು, ಅದು ಒಂದು ಪ್ರಾಮಿಸ್ ಅನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ. ಪ್ರಾಮಿಸ್ ಪರಿಹಾರವಾದಾಗ, ಅದು ಎರಡು ಪ್ರಾಪರ್ಟಿಗಳನ್ನು ಹೊಂದಿರುವ ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಒದಗಿಸುತ್ತದೆ: value
(ನೀಡಲಾದ ಮೌಲ್ಯ) ಮತ್ತು done
(ಇಟರೇಟರ್ ಅನುಕ್ರಮದ ಅಂತ್ಯವನ್ನು ತಲುಪಿದೆಯೇ ಎಂದು ಸೂಚಿಸುವ ಬೂಲಿಯನ್).
ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಅಸಿಂಕ್ ಇಟರೇಟರ್ಗಳನ್ನು ರಚಿಸುತ್ತವೆ. ನೀವು for await...of
ಲೂಪ್ ಬಳಸಿ ಅಸಿಂಕ್ ಜೆನರೇಟರ್ನಿಂದ ನೀಡಲಾದ ಮೌಲ್ಯಗಳ ಮೇಲೆ ಇಟರೇಟ್ ಮಾಡಬಹುದು.
ಉದಾಹರಣೆ:
async function consumeSequence() {
for await (const num of generateSequence(1, 5)) {
console.log(num);
}
}
consumeSequence(); // Output: 1 (after 500ms), 2 (after 1000ms), 3 (after 1500ms), 4 (after 2000ms), 5 (after 2500ms)
for await...of
ಲೂಪ್ ಅಸಮಕಾಲಿಕವಾಗಿ generateSequence
ಅಸಿಂಕ್ ಜೆನರೇಟರ್ನಿಂದ ನೀಡಲಾದ ಮೌಲ್ಯಗಳ ಮೇಲೆ ಇಟರೇಟ್ ಮಾಡುತ್ತದೆ, ಪ್ರತಿ ಸಂಖ್ಯೆಯನ್ನು ಕನ್ಸೋಲ್ಗೆ ಪ್ರಿಂಟ್ ಮಾಡುತ್ತದೆ.
ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳೊಂದಿಗೆ ಸ್ಟ್ರೀಮ್ ಪ್ರೊಸೆಸಿಂಗ್ ಮಾದರಿಗಳು
ವಿವಿಧ ಸ್ಟ್ರೀಮ್ ಪ್ರೊಸೆಸಿಂಗ್ ಮಾದರಿಗಳನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಲು ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳು ನಂಬಲಾಗದಷ್ಟು ಬಹುಮುಖವಾಗಿವೆ. ಇಲ್ಲಿ ಕೆಲವು ಸಾಮಾನ್ಯ ಮತ್ತು ಶಕ್ತಿಯುತ ಮಾದರಿಗಳಿವೆ:
1. ಡೇಟಾ ಮೂಲದ ಅಮೂರ್ತತೆ
ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳು ವಿವಿಧ ಡೇಟಾ ಮೂಲಗಳ ಸಂಕೀರ್ಣತೆಗಳನ್ನು ಅಮೂರ್ತಗೊಳಿಸಬಹುದು, ಡೇಟಾದ ಮೂಲವನ್ನು ಲೆಕ್ಕಿಸದೆ ಅದನ್ನು ಪ್ರವೇಶಿಸಲು ಏಕೀಕೃತ ಇಂಟರ್ಫೇಸ್ ಅನ್ನು ಒದಗಿಸುತ್ತವೆ. APIಗಳು, ಡೇಟಾಬೇಸ್ಗಳು ಅಥವಾ ಫೈಲ್ ಸಿಸ್ಟಮ್ಗಳೊಂದಿಗೆ ವ್ಯವಹರಿಸುವಾಗ ಇದು ವಿಶೇಷವಾಗಿ ಸಹಾಯಕವಾಗಿದೆ.
ಉದಾಹರಣೆ: API ಯಿಂದ ಡೇಟಾವನ್ನು ಪಡೆಯುವುದು
async function* fetchUsers(apiUrl) {
let page = 1;
while (true) {
const url = `${apiUrl}?page=${page}`;
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
if (data.length === 0) {
return; // No more data
}
for (const user of data) {
yield user;
}
page++;
}
}
async function processUsers() {
const userGenerator = fetchUsers('https://api.example.com/users'); // Replace with your API endpoint
for await (const user of userGenerator) {
console.log(user.name);
// Process each user
}
}
processUsers();
ಈ ಉದಾಹರಣೆಯಲ್ಲಿ, fetchUsers
ಅಸಿಂಕ್ ಜೆನರೇಟರ್ API ಎಂಡ್ಪಾಯಿಂಟ್ನಿಂದ ಬಳಕೆದಾರರನ್ನು ಪಡೆಯುತ್ತದೆ, ಪುಟ ವಿನ್ಯಾಸವನ್ನು (pagination) ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿರ್ವಹಿಸುತ್ತದೆ. processUsers
ಫಂಕ್ಷನ್ ಡೇಟಾ ಸ್ಟ್ರೀಮ್ ಅನ್ನು ಬಳಸುತ್ತದೆ ಮತ್ತು ಪ್ರತಿ ಬಳಕೆದಾರರನ್ನು ಪ್ರೊಸೆಸ್ ಮಾಡುತ್ತದೆ.
ಅಂತಾರಾಷ್ಟ್ರೀಕರಣದ ಟಿಪ್ಪಣಿ: API ಗಳಿಂದ ಡೇಟಾವನ್ನು ಪಡೆಯುವಾಗ, API ಎಂಡ್ಪಾಯಿಂಟ್ ಅಂತಾರಾಷ್ಟ್ರೀಕರಣದ ಮಾನದಂಡಗಳಿಗೆ (ಉದಾಹರಣೆಗೆ, ಭಾಷಾ ಕೋಡ್ಗಳು ಮತ್ತು ಪ್ರಾದೇಶಿಕ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬೆಂಬಲಿಸುವುದು) ಬದ್ಧವಾಗಿದೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ, ಇದರಿಂದ ವಿಶ್ವಾದ್ಯಂತ ಬಳಕೆದಾರರಿಗೆ ಸ್ಥಿರವಾದ ಅನುಭವವನ್ನು ಒದಗಿಸಬಹುದು.
2. ಡೇಟಾ ರೂಪಾಂತರ ಮತ್ತು ಫಿಲ್ಟರಿಂಗ್
ಡೇಟಾ ಸ್ಟ್ರೀಮ್ಗಳನ್ನು ರೂಪಾಂತರಿಸಲು ಮತ್ತು ಫಿಲ್ಟರ್ ಮಾಡಲು ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳನ್ನು ಬಳಸಬಹುದು, ಮುಖ್ಯ ಥ್ರೆಡ್ ಅನ್ನು ಬ್ಲಾಕ್ ಮಾಡದೆ ಅಸಮಕಾಲಿಕವಾಗಿ ರೂಪಾಂತರಗಳನ್ನು ಅನ್ವಯಿಸಬಹುದು.
ಉದಾಹರಣೆ: ಲಾಗ್ ಎಂಟ್ರಿಗಳನ್ನು ಫಿಲ್ಟರ್ ಮಾಡುವುದು ಮತ್ತು ರೂಪಾಂತರಿಸುವುದು
async function* filterAndTransformLogs(logGenerator, filterKeyword) {
for await (const logEntry of logGenerator) {
if (logEntry.message.includes(filterKeyword)) {
const transformedEntry = {
timestamp: logEntry.timestamp,
level: logEntry.level,
message: logEntry.message.toUpperCase(),
};
yield transformedEntry;
}
}
}
async function* readLogsFromFile(filePath) {
// Simulating reading logs from a file asynchronously
const logs = [
{ timestamp: '2024-01-01T00:00:00', level: 'INFO', message: 'System started' },
{ timestamp: '2024-01-01T00:00:05', level: 'WARN', message: 'Low memory warning' },
{ timestamp: '2024-01-01T00:00:10', level: 'ERROR', message: 'Database connection failed' },
];
for (const log of logs) {
await new Promise(resolve => setTimeout(resolve, 100)); // Simulate async read
yield log;
}
}
async function processFilteredLogs() {
const logGenerator = readLogsFromFile('logs.txt');
const filteredLogs = filterAndTransformLogs(logGenerator, 'ERROR');
for await (const log of filteredLogs) {
console.log(log);
}
}
processFilteredLogs();
ಈ ಉದಾಹರಣೆಯಲ್ಲಿ, filterAndTransformLogs
ಕೀವರ್ಡ್ ಆಧರಿಸಿ ಲಾಗ್ ಎಂಟ್ರಿಗಳನ್ನು ಫಿಲ್ಟರ್ ಮಾಡುತ್ತದೆ ಮತ್ತು ಹೊಂದಾಣಿಕೆಯಾಗುವ ಎಂಟ್ರಿಗಳನ್ನು ದೊಡ್ಡಕ್ಷರಕ್ಕೆ (uppercase) ರೂಪಾಂತರಿಸುತ್ತದೆ. readLogsFromFile
ಫಂಕ್ಷನ್ ಫೈಲ್ನಿಂದ ಲಾಗ್ ಎಂಟ್ರಿಗಳನ್ನು ಅಸಮಕಾಲಿಕವಾಗಿ ಓದುವುದನ್ನು ಅನುಕರಿಸುತ್ತದೆ.
3. ಏಕಕಾಲಿಕ ಪ್ರೊಸೆಸಿಂಗ್
ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳನ್ನು Promise.all
ಅಥವಾ ಅಂತಹುದೇ ಏಕಕಾಲಿಕ ಕಾರ್ಯವಿಧಾನಗಳೊಂದಿಗೆ ಸಂಯೋಜಿಸಿ ಡೇಟಾವನ್ನು ಏಕಕಾಲದಲ್ಲಿ ಪ್ರೊಸೆಸ್ ಮಾಡಬಹುದು, ಇದು ಗಣನಾತ್ಮಕವಾಗಿ ತೀವ್ರವಾದ ಕಾರ್ಯಗಳ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಸುಧಾರಿಸುತ್ತದೆ.
ಉದಾಹರಣೆ: ಚಿತ್ರಗಳನ್ನು ಏಕಕಾಲದಲ್ಲಿ ಪ್ರೊಸೆಸ್ ಮಾಡುವುದು
async function* generateImagePaths(imageUrls) {
for (const url of imageUrls) {
yield url;
}
}
async function processImage(imageUrl) {
// Simulate image processing
await new Promise(resolve => setTimeout(resolve, 200));
console.log(`Processed image: ${imageUrl}`);
return `Processed: ${imageUrl}`;
}
async function processImagesConcurrently(imageUrls, concurrencyLimit) {
const imageGenerator = generateImagePaths(imageUrls);
const processingPromises = [];
async function processNextImage() {
const { value, done } = await imageGenerator.next();
if (done) {
return;
}
const processingPromise = processImage(value);
processingPromises.push(processingPromise);
processingPromise.finally(() => {
// Remove the completed promise from the array
processingPromises.splice(processingPromises.indexOf(processingPromise), 1);
// Start processing the next image if possible
if (processingPromises.length < concurrencyLimit) {
processNextImage();
}
});
if (processingPromises.length < concurrencyLimit) {
processNextImage();
}
}
// Start initial concurrent processes
for (let i = 0; i < concurrencyLimit && i < imageUrls.length; i++) {
processNextImage();
}
// Wait for all promises to resolve before returning
await Promise.all(processingPromises);
console.log('All images processed.');
}
const imageUrls = [
'https://example.com/image1.jpg',
'https://example.com/image2.jpg',
'https://example.com/image3.jpg',
'https://example.com/image4.jpg',
'https://example.com/image5.jpg',
];
processImagesConcurrently(imageUrls, 2);
ಈ ಉದಾಹರಣೆಯಲ್ಲಿ, generateImagePaths
ಇಮೇಜ್ URL ಗಳ ಸ್ಟ್ರೀಮ್ ಅನ್ನು ನೀಡುತ್ತದೆ. processImage
ಫಂಕ್ಷನ್ ಇಮೇಜ್ ಪ್ರೊಸೆಸಿಂಗ್ ಅನ್ನು ಅನುಕರಿಸುತ್ತದೆ. processImagesConcurrently
ಪ್ರಾಮಿಸ್ ಅರೇಯನ್ನು ಬಳಸಿಕೊಂಡು ಏಕಕಾಲಿಕ ಪ್ರೊಸೆಸ್ಗಳ ಸಂಖ್ಯೆಯನ್ನು 2 ಕ್ಕೆ ಸೀಮಿತಗೊಳಿಸಿ ಚಿತ್ರಗಳನ್ನು ಏಕಕಾಲದಲ್ಲಿ ಪ್ರೊಸೆಸ್ ಮಾಡುತ್ತದೆ. ಸಿಸ್ಟಮ್ ಅನ್ನು ಓವರ್ಲೋಡ್ ಮಾಡುವುದನ್ನು ತಡೆಯಲು ಇದು ಮುಖ್ಯವಾಗಿದೆ. ಪ್ರತಿ ಚಿತ್ರವನ್ನು setTimeout ಮೂಲಕ ಅಸಮಕಾಲಿಕವಾಗಿ ಪ್ರೊಸೆಸ್ ಮಾಡಲಾಗುತ್ತದೆ. ಅಂತಿಮವಾಗಿ, Promise.all
ಒಟ್ಟಾರೆ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ಕೊನೆಗೊಳಿಸುವ ಮೊದಲು ಎಲ್ಲಾ ಪ್ರೊಸೆಸ್ಗಳು ಮುಗಿಯುವುದನ್ನು ಖಚಿತಪಡಿಸುತ್ತದೆ.
4. ಬ್ಯಾಕ್ಪ್ರೆಶರ್ ನಿರ್ವಹಣೆ
ಸ್ಟ್ರೀಮ್ ಪ್ರೊಸೆಸಿಂಗ್ನಲ್ಲಿ ಬ್ಯಾಕ್ಪ್ರೆಶರ್ ಒಂದು ನಿರ್ಣಾಯಕ ಪರಿಕಲ್ಪನೆಯಾಗಿದೆ, ವಿಶೇಷವಾಗಿ ಡೇಟಾ ಉತ್ಪಾದನೆಯ ದರವು ಡೇಟಾ ಬಳಕೆಯ ದರವನ್ನು ಮೀರಿದಾಗ. ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳನ್ನು ಬ್ಯಾಕ್ಪ್ರೆಶರ್ ಕಾರ್ಯವಿಧಾನಗಳನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಲು ಬಳಸಬಹುದು, ಇದು ಗ್ರಾಹಕರು ಓವರ್ಲೋಡ್ ಆಗುವುದನ್ನು ತಡೆಯುತ್ತದೆ.
ಉದಾಹರಣೆ: ದರ ಸೀಮಿತಗೊಳಿಸುವಿಕೆಯನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವುದು
async function* applyRateLimit(dataGenerator, interval) {
for await (const data of dataGenerator) {
await new Promise(resolve => setTimeout(resolve, interval));
yield data;
}
}
async function* generateData() {
let i = 0;
while (true) {
await new Promise(resolve => setTimeout(resolve, 10)); // Simulate a fast producer
yield `Data ${i++}`;
}
}
async function consumeData() {
const dataGenerator = generateData();
const rateLimitedData = applyRateLimit(dataGenerator, 500); // Limit to one item every 500ms
for await (const data of rateLimitedData) {
console.log(data);
}
}
// consumeData(); // Careful, this will run indefinitely
ಈ ಉದಾಹರಣೆಯಲ್ಲಿ, applyRateLimit
dataGenerator
ನಿಂದ ಡೇಟಾ ನೀಡಲಾಗುವ ದರವನ್ನು ಸೀಮಿತಗೊಳಿಸುತ್ತದೆ, ಗ್ರಾಹಕರು ಅದನ್ನು ಪ್ರೊಸೆಸ್ ಮಾಡುವುದಕ್ಕಿಂತ ವೇಗವಾಗಿ ಡೇಟಾವನ್ನು ಸ್ವೀಕರಿಸುವುದಿಲ್ಲ ಎಂದು ಖಚಿತಪಡಿಸುತ್ತದೆ.
5. ಸ್ಟ್ರೀಮ್ಗಳನ್ನು ಸಂಯೋಜಿಸುವುದು
ಸಂಕೀರ್ಣ ಡೇಟಾ ಪೈಪ್ಲೈನ್ಗಳನ್ನು ರಚಿಸಲು ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳನ್ನು ಸಂಯೋಜಿಸಬಹುದು. ಬಹು ಮೂಲಗಳಿಂದ ಡೇಟಾವನ್ನು ವಿಲೀನಗೊಳಿಸಲು, ಸಂಕೀರ್ಣ ರೂಪಾಂತರಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಅಥವಾ ಕವಲೊಡೆಯುವ ಡೇಟಾ ಹರಿವುಗಳನ್ನು ರಚಿಸಲು ಇದು ಉಪಯುಕ್ತವಾಗಬಹುದು.
ಉದಾಹರಣೆ: ಎರಡು API ಗಳಿಂದ ಡೇಟಾವನ್ನು ವಿಲೀನಗೊಳಿಸುವುದು
async function* mergeStreams(stream1, stream2) {
const iterator1 = stream1();
const iterator2 = stream2();
let next1 = iterator1.next();
let next2 = iterator2.next();
while (!((await next1).done && (await next2).done)) {
if (!(await next1).done) {
yield (await next1).value;
next1 = iterator1.next();
}
if (!(await next2).done) {
yield (await next2).value;
next2 = iterator2.next();
}
}
}
async function* generateNumbers(limit) {
for (let i = 1; i <= limit; i++) {
await new Promise(resolve => setTimeout(resolve, 100));
yield i;
}
}
async function* generateLetters(limit) {
const letters = 'abcdefghijklmnopqrstuvwxyz';
for (let i = 0; i < limit; i++) {
await new Promise(resolve => setTimeout(resolve, 150));
yield letters[i];
}
}
async function processMergedData() {
const numberStream = () => generateNumbers(5);
const letterStream = () => generateLetters(3);
const mergedStream = mergeStreams(numberStream, letterStream);
for await (const item of mergedStream) {
console.log(item);
}
}
processMergedData();
ಈ ಉದಾಹರಣೆಯಲ್ಲಿ, mergeStreams
ಎರಡು ಅಸಿಂಕ್ ಜೆನರೇಟರ್ ಫಂಕ್ಷನ್ಗಳಿಂದ ಡೇಟಾವನ್ನು ವಿಲೀನಗೊಳಿಸುತ್ತದೆ, ಅವುಗಳ ಔಟ್ಪುಟ್ ಅನ್ನು ಪರಸ್ಪರ ಸೇರಿಸುತ್ತದೆ. generateNumbers
ಮತ್ತು generateLetters
ಕ್ರಮವಾಗಿ ಸಂಖ್ಯಾತ್ಮಕ ಮತ್ತು ಅಕ್ಷರಮಾಲೆಯ ಡೇಟಾವನ್ನು ಒದಗಿಸುವ ಮಾದರಿ ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳಾಗಿವೆ.
ಸುಧಾರಿತ ತಂತ್ರಗಳು ಮತ್ತು ಪರಿಗಣನೆಗಳು
ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳು ಅಸಮಕಾಲಿಕ ಸ್ಟ್ರೀಮ್ಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಶಕ್ತಿಯುತ ಮಾರ್ಗವನ್ನು ನೀಡುತ್ತವೆಯಾದರೂ, ಕೆಲವು ಸುಧಾರಿತ ತಂತ್ರಗಳು ಮತ್ತು ಸಂಭಾವ್ಯ ಸವಾಲುಗಳನ್ನು ಪರಿಗಣಿಸುವುದು ಮುಖ್ಯವಾಗಿದೆ.
ದೋಷ ನಿರ್ವಹಣೆ
ಅಸಮಕಾಲಿಕ ಕೋಡ್ನಲ್ಲಿ ಸರಿಯಾದ ದೋಷ ನಿರ್ವಹಣೆ ನಿರ್ಣಾಯಕವಾಗಿದೆ. ದೋಷಗಳನ್ನು ಸರಿಯಾಗಿ ನಿರ್ವಹಿಸಲು ನೀವು ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳೊಳಗೆ try...catch
ಬ್ಲಾಕ್ಗಳನ್ನು ಬಳಸಬಹುದು.
async function* safeGenerator() {
try {
// Asynchronous operations that might throw errors
const data = await fetchData();
yield data;
} catch (error) {
console.error('Error in generator:', error);
// Optionally yield an error value or terminate the generator
yield { error: error.message };
return; // Stop the generator
}
}
ರದ್ದತಿ
ಕೆಲವು ಸಂದರ್ಭಗಳಲ್ಲಿ, ನೀವು ನಡೆಯುತ್ತಿರುವ ಅಸಮಕಾಲಿಕ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ರದ್ದುಗೊಳಿಸಬೇಕಾಗಬಹುದು. ಇದನ್ನು AbortController ನಂತಹ ತಂತ್ರಗಳನ್ನು ಬಳಸಿ ಸಾಧಿಸಬಹುದು.
async function* fetchWithCancellation(url, signal) {
try {
const response = await fetch(url, { signal });
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
yield data;
} catch (error) {
if (error.name === 'AbortError') {
console.log('Fetch aborted');
return;
}
throw error;
}
}
const controller = new AbortController();
const { signal } = controller;
async function consumeData() {
const dataGenerator = fetchWithCancellation('https://api.example.com/data', signal); // Replace with your API endpoint
setTimeout(() => {
controller.abort(); // Abort the fetch after 2 seconds
}, 2000);
try {
for await (const data of dataGenerator) {
console.log(data);
}
} catch (error) {
console.error('Error during consumption:', error);
}
}
consumeData();
ಮೆಮೊರಿ ನಿರ್ವಹಣೆ
ದೊಡ್ಡ ಡೇಟಾ ಸ್ಟ್ರೀಮ್ಗಳೊಂದಿಗೆ ವ್ಯವಹರಿಸುವಾಗ, ಮೆಮೊರಿಯನ್ನು ಸಮರ್ಥವಾಗಿ ನಿರ್ವಹಿಸುವುದು ಮುಖ್ಯ. ಒಂದೇ ಬಾರಿಗೆ ದೊಡ್ಡ ಪ್ರಮಾಣದ ಡೇಟಾವನ್ನು ಮೆಮೊರಿಯಲ್ಲಿ ಇಡುವುದನ್ನು ತಪ್ಪಿಸಿ. ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳು, ತಮ್ಮ ಸ್ವಭಾವದಿಂದ, ಡೇಟಾವನ್ನು ತುಣುಕುಗಳಲ್ಲಿ ಪ್ರೊಸೆಸ್ ಮಾಡುವ ಮೂಲಕ ಇದಕ್ಕೆ ಸಹಾಯ ಮಾಡುತ್ತವೆ.
ಡೀಬಗ್ ಮಾಡುವುದು
ಅಸಮಕಾಲಿಕ ಕೋಡ್ ಅನ್ನು ಡೀಬಗ್ ಮಾಡುವುದು ಸವಾಲಿನದ್ದಾಗಿರಬಹುದು. ನಿಮ್ಮ ಕೋಡ್ ಮೂಲಕ ಹಂತ-ಹಂತವಾಗಿ ಹೋಗಲು ಮತ್ತು ವೇರಿಯಬಲ್ಗಳನ್ನು ಪರೀಕ್ಷಿಸಲು ಬ್ರೌಸರ್ ಡೆವಲಪರ್ ಪರಿಕರಗಳು ಅಥವಾ Node.js ಡೀಬಗ್ಗರ್ಗಳನ್ನು ಬಳಸಿ.
ನೈಜ-ಪ್ರಪಂಚದ ಅಪ್ಲಿಕೇಶನ್ಗಳು
ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳು ಹಲವಾರು ನೈಜ-ಪ್ರಪಂಚದ ಸನ್ನಿವೇಶಗಳಲ್ಲಿ ಅನ್ವಯವಾಗುತ್ತವೆ:
- ನೈಜ-ಸಮಯದ ಡೇಟಾ ಪ್ರೊಸೆಸಿಂಗ್: WebSockets ಅಥವಾ ಸರ್ವರ್-ಸೆಂಟ್ ಈವೆಂಟ್ಗಳಿಂದ (SSE) ಡೇಟಾವನ್ನು ಪ್ರೊಸೆಸ್ ಮಾಡುವುದು.
- ದೊಡ್ಡ ಫೈಲ್ ಪ್ರೊಸೆಸಿಂಗ್: ದೊಡ್ಡ ಫೈಲ್ಗಳನ್ನು ತುಣುಕುಗಳಲ್ಲಿ ಓದುವುದು ಮತ್ತು ಪ್ರೊಸೆಸ್ ಮಾಡುವುದು.
- ಡೇಟಾಬೇಸ್ಗಳಿಂದ ಡೇಟಾ ಸ್ಟ್ರೀಮಿಂಗ್: ಎಲ್ಲವನ್ನೂ ಒಂದೇ ಬಾರಿಗೆ ಮೆಮೊರಿಗೆ ಲೋಡ್ ಮಾಡದೆ ಡೇಟಾಬೇಸ್ಗಳಿಂದ ದೊಡ್ಡ ಡೇಟಾಸೆಟ್ಗಳನ್ನು ಪಡೆಯುವುದು ಮತ್ತು ಪ್ರೊಸೆಸ್ ಮಾಡುವುದು.
- API ಡೇಟಾ ಒಟ್ಟುಗೂಡಿಸುವಿಕೆ: ಏಕೀಕೃತ ಡೇಟಾ ಸ್ಟ್ರೀಮ್ ಅನ್ನು ರಚಿಸಲು ಬಹು API ಗಳಿಂದ ಡೇಟಾವನ್ನು ಸಂಯೋಜಿಸುವುದು.
- ETL (Extract, Transform, Load) ಪೈಪ್ಲೈನ್ಗಳು: ಡೇಟಾ ವೇರ್ಹೌಸಿಂಗ್ ಮತ್ತು ಅನಾಲಿಟಿಕ್ಸ್ಗಾಗಿ ಸಂಕೀರ್ಣ ಡೇಟಾ ಪೈಪ್ಲೈನ್ಗಳನ್ನು ನಿರ್ಮಿಸುವುದು.
ಉದಾಹರಣೆ: ದೊಡ್ಡ CSV ಫೈಲ್ ಅನ್ನು ಪ್ರೊಸೆಸ್ ಮಾಡುವುದು (Node.js)
const fs = require('fs');
const readline = require('readline');
async function* readCSV(filePath) {
const fileStream = fs.createReadStream(filePath);
const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity,
});
for await (const line of rl) {
// Process each line as a CSV record
const record = line.split(',');
yield record;
}
}
async function processCSV() {
const csvGenerator = readCSV('large_data.csv');
for await (const record of csvGenerator) {
// Process each record
console.log(record);
}
}
// processCSV();
ತೀರ್ಮಾನ
ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳು ಅಸಮಕಾಲಿಕ ಡೇಟಾ ಸ್ಟ್ರೀಮ್ಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಶಕ್ತಿಯುತ ಮತ್ತು ಸೊಗಸಾದ ಮಾರ್ಗವನ್ನು ನೀಡುತ್ತವೆ. ಡೇಟಾ ಮೂಲದ ಅಮೂರ್ತತೆ, ರೂಪಾಂತರ, ಏಕಕಾಲಿಕತೆ, ಬ್ಯಾಕ್ಪ್ರೆಶರ್, ಮತ್ತು ಸ್ಟ್ರೀಮ್ ಸಂಯೋಜನೆಯಂತಹ ಸ್ಟ್ರೀಮ್ ಪ್ರೊಸೆಸಿಂಗ್ ಮಾದರಿಗಳಲ್ಲಿ ಪಾಂಡಿತ್ಯವನ್ನು ಹೊಂದುವ ಮೂಲಕ, ನೀವು ದೊಡ್ಡ ಡೇಟಾಸೆಟ್ಗಳು ಮತ್ತು ನೈಜ-ಸಮಯದ ಡೇಟಾ ಫೀಡ್ಗಳನ್ನು ಪರಿಣಾಮಕಾರಿಯಾಗಿ ನಿರ್ವಹಿಸುವ ದಕ್ಷ ಮತ್ತು ಸ್ಕೇಲೆಬಲ್ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ನಿರ್ಮಿಸಬಹುದು. ದೋಷ ನಿರ್ವಹಣೆ, ರದ್ದತಿ, ಮೆಮೊರಿ ನಿರ್ವಹಣೆ ಮತ್ತು ಡೀಬಗ್ ಮಾಡುವ ತಂತ್ರಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವುದು ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುವ ನಿಮ್ಮ ಸಾಮರ್ಥ್ಯವನ್ನು ಇನ್ನಷ್ಟು ಹೆಚ್ಚಿಸುತ್ತದೆ. ಅಸಮಕಾಲಿಕ ಪ್ರೋಗ್ರಾಮಿಂಗ್ ಹೆಚ್ಚು ಪ್ರಚಲಿತವಾಗುತ್ತಿರುವುದರಿಂದ, ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳು ಆಧುನಿಕ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಡೆವಲಪರ್ಗಳಿಗೆ ಮೌಲ್ಯಯುತವಾದ ಪರಿಕರಗಳ ಗುಂಪನ್ನು ಒದಗಿಸುತ್ತವೆ.
ನಿಮ್ಮ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಪ್ರಾಜೆಕ್ಟ್ಗಳಲ್ಲಿ ಅಸಮಕಾಲಿಕ ಡೇಟಾ ಪ್ರೊಸೆಸಿಂಗ್ನ ಸಂಪೂರ್ಣ ಸಾಮರ್ಥ್ಯವನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಲು ಅಸಿಂಕ್ ಜೆನರೇಟರ್ಗಳನ್ನು ಅಳವಡಿಸಿಕೊಳ್ಳಿ.