টাইমার মডিউল কি?
টাইমার মডিউল এমন ফাংশন সরবরাহ করে যা আপনাকে নির্দিষ্ট সময় বা বিরতিতে কোড নির্বাহের সময়সূচী করতে সহায়তা করে।
ব্রাউজার জাভাস্ক্রিপ্টের বিপরীতে, Node.js টাইমিং ফাংশনগুলি টাইমার মডিউলের অংশ হিসাবে সরবরাহ করা হয়, যদিও সেগুলি কোনও স্পষ্ট আমদানি ছাড়াই বিশ্বব্যাপী উপলব্ধ।
মূল বৈশিষ্ট্য:
setTimeout()
বিলম্বিত সক্রিয়করণ
setInterval()
বারবার সক্রিয়করণ
setImmediate()
পরবর্তী ইভেন্ট লুপে অবিলম্বে সম্পাদন
প্রতিশ্রুতি-ভিত্তিক API
আধুনিক অ্যাসিঙ্ক/ওয়েট পদ্ধতির জন্য
এই ক্ষমতাগুলি প্রতিক্রিয়াশীল অ্যাপ্লিকেশন তৈরি, পোলিং বাস্তবায়ন, বিলম্বিত ক্রিয়াকলাপ পরিচালনা এবং আরও অনেক কিছুর জন্য অপরিহার্য।
টাইমার দিয়ে শুরু করা
কোড নির্বাহের সময়সূচী করতে টাইমার মডিউল ব্যবহার করার একটি দ্রুত উদাহরণ এখানে:
বেসিক টাইমার উদাহরণ
const { setTimeout, setInterval, setImmediate } = require('timers');
console.log('Starting timers...');
// Execute once after delay
setTimeout(() => {
console.log('This runs after 1 second');
}, 1000);
// Execute repeatedly at interval
let counter = 0;
const interval = setInterval(() => {
counter++;
console.log(`Interval tick ${counter}`);
if (counter >= 3) clearInterval(interval);
}, 1000);
// Execute in the next event loop iteration
setImmediate(() => {
console.log('This runs in the next iteration of the event loop');
});
console.log('Timers scheduled');
টাইমার মডিউল ব্যবহার করে
টাইমার মডিউলের ফাংশনগুলি বিশ্বব্যাপী উপলব্ধ, তাই আপনাকে স্পষ্টভাবে তাদের প্রয়োজন হবে না।
যাইহোক, আপনি যদি উন্নত বৈশিষ্ট্যগুলিতে অ্যাক্সেস চান বা স্পষ্টতার জন্য, আপনি মডিউলটি আমদানি করতে পারেন:
const timers = require('timers');
// Or, for the promises API (Node.js 15.0.0+)
const timersPromises = require('timers/promises');
setTimeout() এবং clearTimeout()
setTimeout() ফাংশন একটি নির্দিষ্ট সময়ের পরে (মিলিসেকেন্ডে) একটি কলব্যাক কার্যকর করার সময়সূচী করে।
এটি একটি টাইমআউট অবজেক্ট প্রদান করে যা টাইমআউট বাতিল করতে ব্যবহার করা যেতে পারে।
সাধারণ ব্যবহারের ক্ষেত্রে
- অপ্রয়োজনীয় কাজ সম্পাদনে বিলম্ব করা
- ক্রিয়াকলাপের জন্য সময়সীমা বাস্তবায়ন করা
- সিপিইউ-নিবিড় কাজগুলি ভেঙে ফেলা
- পুনরায় চেষ্টা যুক্তি প্রয়োগ করা হচ্ছে
// Basic usage
setTimeout(() => {
console.log('This message is displayed after 2 seconds');
}, 2000);
// With arguments
setTimeout((name) => {
console.log(`Hello, ${name}!`);
}, 1000, 'World');
// Storing and clearing a timeout
const timeoutId = setTimeout(() => {
console.log('This will never be displayed');
}, 5000);
// Cancel the timeout before it executes
clearTimeout(timeoutId);
console.log('Timeout has been cancelled');
প্রতিশ্রুতি-ভিত্তিক সেটটাইমআউট
Node.js 15.0.0 timers promises- API :
const { setTimeout } = require('timers/promises');
async function delayedGreeting() {
console.log('Starting...');
// Wait for 2 seconds
await setTimeout(2000);
console.log('After 2 seconds');
// Wait for 1 second with a value
const result = await setTimeout(1000, 'Hello, World!');
console.log('After 1 more second:', result);
}
delayedGreeting().catch(console.error);
setInterval() এবং clearInterval()
setInterval() ফাংশন নির্দিষ্ট ব্যবধানে (মিলিসেকেন্ডে) একটি ফাংশনকে বারবার কল করে।
এটি একটি ইন্টারভাল অবজেক্ট প্রদান করে যা ব্যবধান বন্ধ করতে ব্যবহার করা যেতে পারে।
সাধারণ ব্যবহারের ক্ষেত্রে
- আপডেটের জন্য পোলিং
- পর্যায়ক্রমিক রক্ষণাবেক্ষণ কাজ চলমান
- হার্টবিট মেকানিজম বাস্তবায়ন
- নিয়মিত বিরতিতে UI উপাদান আপডেট করা হচ্ছে
দ্রষ্টব্য:
যদি ইভেন্ট লুপ অন্যান্য ক্রিয়াকলাপ দ্বারা অবরুদ্ধ করা হয়, তাহলে মৃত্যুদন্ডের মধ্যে প্রকৃত ব্যবধান নির্দিষ্ট সময়ের চেয়ে দীর্ঘ হতে পারে।
// Basic interval
let counter = 0;
const intervalId = setInterval(() => {
counter++;
console.log(`Interval executed ${counter} times`);
// Stop after 5 executions
if (counter >= 5) {
clearInterval(intervalId);
console.log('Interval stopped');
}
}, 1000);
// Interval with arguments
const nameInterval = setInterval((name) => {
console.log(`Hello, ${name}!`);
}, 2000, 'Node.js');
// Stop the name interval after 6 seconds
setTimeout(() => {
clearInterval(nameInterval);
console.log('Name interval stopped');
}, 6000);
প্রতিশ্রুতি-ভিত্তিক সেটইন্টারভাল
বিরতির জন্য প্রতিশ্রুতি API ব্যবহার করে:
const { setInterval } = require('timers/promises');
async function repeatedGreeting() {
console.log('Starting interval...');
// Create an async iterator from setInterval
const interval = setInterval(1000, 'tick');
// Limit to 5 iterations
let counter = 0;
for await (const tick of interval) {
console.log(counter + 1, tick);
counter++;
if (counter >= 5) {
break; // Exit the loop, stopping the interval
}
}
console.log('Interval finished');
}
repeatedGreeting().catch(console.error);
setImmediate() এবং clearImmediate()
setImmediate() ফাংশন I/O ইভেন্টের পরে কিন্তু টাইমারের আগে ইভেন্ট লুপের পরবর্তী পুনরাবৃত্তিতে চালানোর জন্য একটি কলব্যাক নির্ধারণ করে।
এটি সেটটাইমআউট (কলব্যাক, 0) ব্যবহার করার মতো, তবে আরও দক্ষ।
কখন setImmediate() ব্যবহার করবেন
- আপনি যখন বর্তমান ফাংশন শেষ হওয়ার পরে কোডটি চালাতে চান
- দীর্ঘস্থায়ী কাজগুলিকে ছোট ছোট অংশে বিভক্ত করুন
- I/O ক্রিয়াকলাপ সম্পূর্ণ হওয়ার পরে কলব্যাক চালানো হয় তা নিশ্চিত করতে
- পুনরাবৃত্ত অপারেশনে স্ট্যাক ওভারফ্লো প্রতিরোধ করুন
console.log('Start');
setTimeout(() => {
console.log('setTimeout callback');
}, 0);
setImmediate(() => {
console.log('setImmediate callback');
});
process.nextTick(() => {
console.log('nextTick callback');
});
console.log('End');
মৃত্যুদন্ডের আদেশ সাধারণত:
- Start
- End
- nextTick callback
- সেটটাইমআউট কলব্যাক বা সেট ইমিডিয়েট কলব্যাক (অর্ডার পরিবর্তিত হতে পারে)
দ্রষ্টব্য:
মূল মডিউল থেকে কল করা হলে setTimeout(0) এবং setImmediate() এর মধ্যে নির্বাহের ক্রমটি অপ্রত্যাশিত হতে পারে।
যাইহোক, একটি I/O কলব্যাকের ভিতরে, setImmediate() সর্বদা যেকোনো টাইমারের আগে চলে।
তাত্ক্ষণিক বাতিলকরণ
const immediateId = setImmediate(() => {
console.log('This will not be displayed');
});
clearImmediate(immediateId);
console.log('Immediate has been cancelled');
process.nextTick()
যদিও টাইমার মডিউলের অংশ নয়, process.nextTick() একটি সম্পর্কিত ফাংশন যা ইভেন্ট লুপের পরবর্তী পুনরাবৃত্তি না হওয়া পর্যন্ত একটি কলব্যাক বিলম্বিত করে, কিন্তু যেকোনো I/O ইভেন্ট বা টাইমারের আগে এটি কার্যকর করে।
মূল বৈশিষ্ট্য
কখন process.nextTick() ব্যবহার করবেন
- বর্তমান অপারেশনের পরে কিন্তু যেকোনো I/O এর আগে একটি কলব্যাক চলে তা নিশ্চিত করতে
- দীর্ঘস্থায়ী অপারেশন ব্রেক আপ করুন
- একটি বস্তু তৈরি হওয়ার পরে ইভেন্ট হ্যান্ডলারদের সেট করার অনুমতি দিন
- সামঞ্জস্যপূর্ণ API আচরণ নিশ্চিত করতে (যেমন, কনস্ট্রাক্টরদের সাথে বা ছাড়া কাজ করুন)
console.log('Start');
// Schedule three different types of callbacks
setTimeout(() => {
console.log('setTimeout executed');
}, 0);
setImmediate(() => {
console.log('setImmediate executed');
});
process.nextTick(() => {
console.log('nextTick executed');
});
console.log('End');
দ্রষ্টব্য:
process.nextTick() event loop , setImmediate() event loop 'tick' .
উন্নত টাইমার মোড
Debouncing
একটি ফাংশন কার্যকর করতে বিলম্ব করে এটিকে প্রায়শই কল করা থেকে বিরত রাখে:
function debounce(func, delay) {
let timeoutId;
return function(...args) {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => func.apply(this, args), delay);
};
}
// Example usage
const handleResize = debounce(() => {
console.log('Window resized');
}, 300);
// Call handleResize() on window resize
Throttling
সময়ের সাথে একটি ফাংশন কল করার সংখ্যা সীমিত করুন:
function throttle(func, limit) {
let inThrottle = false;
return function(...args) {
if (!inThrottle) {
func.apply(this, args);
inThrottle = true;
setTimeout(() => inThrottle = false, limit);
}
};
}
// Example usage
const handleScroll = throttle(() => {
console.log('Handling scroll');
}, 200);
// Call handleScroll() on window scroll
Sequential Timeouts
তাদের মধ্যে বিলম্ব সহ অপারেশনগুলির একটি সিরিজ চালান:
function sequentialTimeouts(callbacks, delay = 1000) {
let index = 0;
function next() {
if (index < callbacks.length) {
callbacks[index]();
index++;
setTimeout(next, delay);
}
}
next();
}
// Example usage
sequentialTimeouts([
() => console.log('Step 1'),
() => console.log('Step 2'),
() => console.log('Step 3')
], 1000);
টাইমার আচরণ এবং সর্বোত্তম অনুশীলন
টাইমারের নির্ভুলতা এবং দক্ষতা
Node.js timers . :
- সিস্টেম লোড এবং CPU ব্যবহার
- ইভেন্ট লুপ ব্লকিং ফাংশন
- অন্যান্য টাইমার এবং I/O ফাংশন
- কম্পিউটার টাইমার রেজোলিউশন (সাধারণত 1-15ms)
টাইমার সঠিকতা পরিমাপ
const desiredDelay = 100; // 100ms
const start = Date.now();
setTimeout(() => {
const actualDelay = Date.now() - start;
console.log(`Desired delay: ${desiredDelay}ms`);
console.log(`Actual delay: ${actualDelay}ms`);
console.log(`Difference: ${actualDelay - desiredDelay}ms`);
}, desiredDelay);
মেমরি এবং সম্পদ ব্যবস্থাপনা
মেমরি লিক এবং অত্যধিক সম্পদ ব্যবহার প্রতিরোধ করার জন্য টাইমারগুলির সঠিক ব্যবস্থাপনা গুরুত্বপূর্ণ:
সাধারণ মেমরি লিক পদ্ধতি
// Leak: Interval keeps running even if not needed
function startService() {
setInterval(() => {
fetchData();
}, 1000);
}
// Leak: Timeout with closure over large object
function processData(data) {
setTimeout(() => {
console.log('Processing complete');
// 'data' is kept in memory until the timeout fires
}, 10000, data);
}
সর্বোত্তম অনুশীলন
মেমরি ফাঁস প্রতিরোধ করতে, বিশেষত দীর্ঘ-চলমান অ্যাপ্লিকেশনগুলিতে, টাইমারগুলি যখন আর প্রয়োজন হয় না তখন পরিষ্কার করতে ভুলবেন না:
// Bad practice in a server context
function startServer() {
setInterval(() => {
// This interval will run forever and prevent proper cleanup
console.log('Server is running...');
}, 60000);
}
// Better practice
function startServer() {
const intervalId = setInterval(() => {
console.log('Server is running...');
}, 60000);
// Store the interval ID for later cleanup
return {
stop: () => {
clearInterval(intervalId);
console.log('Server stopped');
}
};
}
// Example usage
const server = startServer();
// Stop the server after 3 minutes
setTimeout(() => {
server.stop();
}, 180000);
Zero-Delay Timeouts
সেটটাইমআউট (কলব্যাক, 0) ব্যবহার করার সময়, কলব্যাক অবিলম্বে চালানো হয় না।
বর্তমান ইভেন্ট লুপ চক্র শেষ হওয়ার পরে এটি চলে, যা CPU- নিবিড় কাজগুলিকে "ব্রেক" করতে ব্যবহার করা যেতে পারে:
function processArray(array, processFunction) {
const chunkSize = 1000;
let index = 0;
function processChunk() {
const chunk = array.slice(index, index + chunkSize);
chunk.forEach(processFunction);
index += chunkSize;
if (index < array.length) {
setTimeout(processChunk, 0); // Yield to the event loop
} else {
console.log('Processing complete');
}
}
processChunk();
}
// Example usage
const bigArray = Array(10000).fill().map((_, i) => i);
console.log('Starting processing...');
processArray(bigArray, (item) => {
// Simple processing
if (item % 5000 === 0) {
console.log(`Processed item ${item}`);
}
});
console.log('This will log before processing completes');
সারাংশ
Node.js Timers :
setTimeout()
বিলম্বের পরে একবার কার্যকর করে
setInterval()
বিরতিতে পুনরাবৃত্তিমূলকভাবে সঞ্চালন করে
setImmediate()
পরবর্তী ইভেন্ট লুপে অবিলম্বে কার্যকর করে
প্রতিশ্রুতি APIs
আধুনিক অ্যাসিঙ্ক/ওয়েট পদ্ধতির জন্য
এই টুলগুলিকে সঠিকভাবে বুঝতে এবং ব্যবহার করে, আপনি প্রতিক্রিয়াশীল অ্যাপ্লিকেশন তৈরি করতে, সময়-সংবেদনশীল যুক্তি প্রয়োগ করতে এবং আপনার কোডের কার্যকারিতা উন্নত করতে পারেন।