Node.js Timers Module

Node.js இல் குறிப்பிட்ட நேரங்களில் அல்லது இடைவெளிகளில் குறியீடு செயல்படுத்துதலை கற்றுக்கொள்ளுங்கள்

Timers தொகுதி என்றால் என்ன?

Timers தொகுதி குறிப்பிட்ட நேரங்களில் அல்லது இடைவெளிகளில் குறியீடு செயல்படுத்துதலை திட்டமிட உதவும் செயல்பாடுகளை வழங்குகிறது.

Browser JavaScript இலிருந்து வேறுபட்டு, Node.js நேர செயல்பாடுகள் Timers தொகுதியின் ஒரு பகுதியாக வழங்கப்படுகின்றன, இருப்பினும் அவை வெளிப்படையான இறக்குமதி இல்லாமல் உலகளவில் கிடைக்கின்றன.

முக்கிய அம்சங்கள்:

setTimeout()

தாமதமான செயல்படுத்தல்

setInterval()

மீண்டும் மீண்டும் செயல்படுத்தல்

setImmediate()

அடுத்த event loop இல் உடனடி செயல்படுத்தல்

Promise-அடிப்படையிலான APIகள்

நவீன async/await முறைகளுக்கு

இந்த திறன்கள் பதிலளிக்கும் பயன்பாடுகளை உருவாக்குவதற்கு, polling செயல்படுத்துவதற்கு, தாமதமான செயல்பாடுகளைக் கையாள்வதற்கு மற்றும் பலவற்றுக்கு அத்தியாவசியமானவை.

Timers உடன் தொடங்குதல்

குறியீடு செயல்படுத்துதலை திட்டமிட Timers தொகுதியைப் பயன்படுத்துவதற்கான விரைவான எடுத்துக்காட்டு இங்கே:

அடிப்படை Timer எடுத்துக்காட்டு

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');

Timers தொகுதியைப் பயன்படுத்துதல்

Timers தொகுதியின் செயல்பாடுகள் உலகளவில் கிடைக்கின்றன, எனவே நீங்கள் அவற்றை வெளிப்படையாக தேவைப்படுத்த தேவையில்லை.

இருப்பினும், நீங்கள் மேம்பட்ட அம்சங்களை அணுக விரும்பினால் அல்லது தெளிவுக்காக, நீங்கள் தொகுதியை இறக்குமதி செய்யலாம்:

const timers = require('timers');

// Or, for the promises API (Node.js 15.0.0+)
const timersPromises = require('timers/promises');

setTimeout() மற்றும் clearTimeout()

setTimeout() செயல்பாடு குறிப்பிட்ட நேரத்திற்குப் பிறகு (மில்லி விநாடிகளில்) ஒரு callback இன் செயல்படுத்தலை திட்டமிடுகிறது.

இது timeout ஐ ரத்து செய்ய பயன்படுத்தக்கூடிய ஒரு Timeout பொருளை வழங்குகிறது.

பொதுவான பயன்பாட்டு நிகழ்வுகள்

// 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');

Promise-அடிப்படையிலான setTimeout

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() செயல்பாடு குறிப்பிட்ட இடைவெளிகளில் (மில்லி விநாடிகளில்) ஒரு செயல்பாட்டை மீண்டும் மீண்டும் அழைக்கிறது.

இது இடைவெளியை நிறுத்த பயன்படுத்தக்கூடிய ஒரு Interval பொருளை வழங்குகிறது.

பொதுவான பயன்பாட்டு நிகழ்வுகள்

💡 குறிப்பு:

மற்ற செயல்பாடுகளால் event loop தடுக்கப்பட்டால், செயல்படுத்தல்களுக்கு இடையே உள்ள உண்மையான இடைவெளி குறிப்பிடப்பட்டதை விட நீளமாக இருக்கலாம்.

// 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);

Promise-அடிப்படையிலான setInterval

இடைவெளிகளுக்கான promises 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() செயல்பாடு event loop இன் அடுத்த மறு செய்கையில், I/O நிகழ்வுகளுக்குப் பிறகு ஆனால் timers க்கு முன்பு இயங்க ஒரு callback ஐ திட்டமிடுகிறது.

இது setTimeout(callback, 0) ஐப் பயன்படுத்துவதைப் போன்றது, ஆனால் மிகவும் திறமையானது.

setImmediate() எப்போது பயன்படுத்த வேண்டும்

console.log('Start');

setTimeout(() => {
  console.log('setTimeout callback');
}, 0);

setImmediate(() => {
  console.log('setImmediate callback');
});

process.nextTick(() => {
  console.log('nextTick callback');
});

console.log('End');

செயல்படுத்தல் வரிசை பொதுவாக இருக்கும்:

  1. Start
  2. End
  3. nextTick callback
  4. setTimeout callback அல்லது setImmediate callback (வரிசை மாறுபடலாம்)

💡 குறிப்பு:

முக்கிய தொகுதியிலிருந்து அழைக்கப்படும் போது setTimeout(0) மற்றும் setImmediate() இடையேயான செயல்படுத்தல் வரிசை கணிக்க முடியாததாக இருக்கலாம்.

இருப்பினும், ஒரு I/O callback உள்ளே, setImmediate() எந்த timers க்கும் முன்பு எப்போதும் இயங்கும்.

உடனடியை ரத்து செய்தல்

const immediateId = setImmediate(() => {
  console.log('This will not be displayed');
});

clearImmediate(immediateId);
console.log('Immediate has been cancelled');

process.nextTick()

Timers தொகுதியின் ஒரு பகுதியாக இல்லை என்றாலும், process.nextTick() ஒரு தொடர்புடைய செயல்பாடாகும், இது event loop இன் அடுத்த மறு செய்கை வரை ஒரு callback ஐ தாமதப்படுத்துகிறது, ஆனால் எந்த I/O நிகழ்வுகள் அல்லது timers க்கும் முன்பு அதை இயக்குகிறது.

முக்கிய பண்புகள்

எந்த I/O நிகழ்வுகள் அல்லது timers க்கும் முன்பு இயங்கும்
setImmediate() ஐ விட அதிக முன்னுரிமை
event loop தொடரும் முன் அனைத்து வரிசையில் callbacks செயலாக்குகிறது
அதிகமாகப் பயன்படுத்தப்பட்டால் I/O பட்டினியை ஏற்படுத்தலாம்

process.nextTick() எப்போது பயன்படுத்த வேண்டும்

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' இல் தீய்க்கிறது.

மேம்பட்ட Timer முறைகள்

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);

Timer நடத்தை மற்றும் சிறந்த நடைமுறைகள்

Timer துல்லியம் மற்றும் செயல்திறன்

Node.js timers மில்லி விநாடிக்கு துல்லியமானவை அல்ல. உண்மையான தாமதம் இதன் காரணமாக சற்று நீளமாக இருக்கலாம்:

Timer துல்லியத்தை அளவிடுதல்

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);

நினைவகம் மற்றும் வள மேலாண்மை

நினைவக கசிவுகள் மற்றும் அதிகப்படியான வள பயன்பாட்டைத் தடுக்க timers இன் சரியான மேலாண்மை முக்கியமானது:

பொதுவான நினைவக கசிவு முறைகள்

// 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);
}

சிறந்த நடைமுறைகள்

அவை இனி தேவையில்லாத போது எப்போதும் இடைவெளிகள் மற்றும் timeouts ஐ அழிக்கவும்
சுத்தம் செய்வதற்கு அனுமதிக்கும் வகையில் timer IDs ஐ சேமிக்கவும்
Timer callbacks இல் closures உடன் எச்சரிக்கையாக இருங்கள்
சுத்தம் செய்யும் செயல்பாடுகளில் clearTimeout() மற்றும் clearInterval() ஐப் பயன்படுத்தவும்

நினைவக கசிவுகளைத் தடுக்க, குறிப்பாக நீண்ட-இயங்கும் பயன்பாடுகளில், அவை இனி தேவையில்லாத போது timers ஐ அழிக்க நினைவில் கொள்ளுங்கள்:

// 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

setTimeout(callback, 0) பயன்படுத்தும் போது, callback உடனடியாக இயங்காது.

இது தற்போதைய event loop சுழற்சி முடிந்த பிறகு இயங்கும், இது 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()

அடுத்த event loop இல் உடனடியாக செயல்படுத்துகிறது

Promise APIகள்

நவீன async/await முறைகளுக்கு

இந்த கருவிகளைப் புரிந்துகொண்டு சரியாகப் பயன்படுத்துவதன் மூலம், நீங்கள் பதிலளிக்கும் பயன்பாடுகளை உருவாக்கலாம், நேரம்-தொடர்பான தர்க்கத்தை செயல்படுத்தலாம் மற்றும் உங்கள் குறியீட்டின் செயல்திறனை மேம்படுத்தலாம்.

பயிற்சி

குறிப்பிட்ட தாமதத்திற்குப் பிறகு ஒரு callback ஒரு முறை இயக்க எந்த செயல்பாடு பயன்படுத்தப்படுகிறது?

setInterval()
✗ தவறு! setInterval() மீண்டும் மீண்டும் இயக்குகிறது, ஒரு முறை மட்டும் அல்ல
setImmediate()
✗ தவறு! setImmediate() அடுத்த event loop இல் இயக்குகிறது, குறிப்பிட்ட தாமதத்திற்குப் பிறகு அல்ல
setTimeout()
✓ சரி! setTimeout() குறிப்பிட்ட தாமதத்திற்குப் பிறகு ஒரு callback ஒரு முறை இயக்க பயன்படும் சரியான செயல்பாடாகும்
clearTimeout()
✗ தவறு! clearTimeout() ஒரு timeout ஐ ரத்து செய்கிறது, அதை இயக்கவில்லை