खोज…


इवेंट लूप

ब्लॉकिंग ऑपरेशन उदाहरण

let loop = (i, max) => {
  while (i < max) i++
  return i
}

// This operation will block Node.js
// Because, it's CPU-bound
// You should be careful about this kind of code
loop(0, 1e+12)

गैर-अवरोधक IO ऑपरेशन उदाहरण

let i = 0

const step = max => {
  while (i < max) i++
  console.log('i = %d', i)
}

const tick = max => process.nextTick(step, max)

// this will postpone tick run step's while-loop to event loop cycles
// any other IO-bound operation (like filesystem reading) can take place
// in parallel
tick(1e+6)
tick(1e+7)
console.log('this will output before all of tick operations. i = %d', i)
console.log('because tick operations will be postponed')
tick(1e+8)

घटना पाश आरेख

सरल शब्दों में, इवेंट लूप एक एकल-थ्रेडेड कतार तंत्र है जो आपके सीपीयू-बाउंड कोड को निष्पादित करने के अंत तक और गैर-अवरुद्ध फैशन में आईओ-बाउंड कोड को निष्पादित करता है।

हालाँकि, कालीन के नीचे Node.js अपने कुछ परिचालनों के लिए लिब्रुव लाइब्रेरी के माध्यम से मल्टी-थ्रेडिंग का उपयोग करता है।

प्रदर्शन के विचार

  • गैर-अवरुद्ध संचालन कतार को अवरुद्ध नहीं करेगा और लूप के प्रदर्शन को प्रभावित नहीं करेगा।
  • हालांकि, सीपीयू-बाउंड ऑपरेशंस कतार को अवरुद्ध कर देगा, इसलिए आपको अपने नोड कोड में सीपीयू-बाउंड ऑपरेशंस न करने के लिए सावधान रहना चाहिए।

Node.js गैर-ब्लॉक IO क्योंकि यह ऑपरेटिंग सिस्टम कर्नेल को कार्य को लोड करता है, और जब IO ऑपरेशन डेटा ( एक घटना के रूप में ) की आपूर्ति करता है, तो यह आपके कोड को आपके आपूर्ति किए गए कॉलबैक के साथ सूचित करेगा।

अधिकतम बढ़ाएँ

मूल बातें

require('http').globalAgent.maxSockets = 25

// You can change 25 to Infinity or to a different value by experimenting

Node.js डिफ़ॉल्ट रूप से एक ही समय में ( अधिकतम v0.12.0 के बाद से) maxSockets = Infinity का उपयोग कर रहा है। नोड v0.12.0 तक, डिफ़ॉल्ट maxSockets = 5 (देखें v0.11.0 )। इसलिए, 5 से अधिक अनुरोधों के बाद उन्हें कतारबद्ध किया जाएगा। यदि आप समवर्ती चाहते हैं, तो इस संख्या को बढ़ाएं।

अपना खुद का एजेंट सेट करना

http API " Global Agent " का उपयोग कर रहा है। आप अपने खुद के एजेंट की आपूर्ति कर सकते हैं। ऐशे ही:

const http = require('http')
const myGloriousAgent = new http.Agent({ keepAlive: true })
myGloriousAgent.maxSockets = Infinity

http.request({ ..., agent: myGloriousAgent }, ...)

पूरी तरह से सॉकेट पूलिंग को बंद करना

const http = require('http')
const options = {.....}

options.agent = false

const request = http.request(options)

नुकसान

  • यदि आप एक ही प्रभाव चाहते हैं तो आपको https एपीआई के लिए भी ऐसा ही करना चाहिए

  • उदाहरण के लिए, AWS Infinity बजाय 50 का उपयोग करेगा।

गज़िप सक्षम करें

const http = require('http')
const fs   = require('fs')
const zlib = require('zlib')

http.createServer((request, response) => {
  const stream          = fs.createReadStream('index.html')
  const acceptsEncoding = request.headers['accept-encoding']

  let encoder = {
    hasEncoder     : false,
    contentEncoding: {},
    createEncoder  : () => throw 'There is no encoder'
  }

  if (!acceptsEncoding) {
    acceptsEncoding = ''
  }

  if (acceptsEncoding.match(/\bdeflate\b/)) {
    encoder = {
      hasEncoder     : true,
      contentEncoding: { 'content-encoding': 'deflate' },
      createEncoder  : zlib.createDeflate
    }
  } else if (acceptsEncoding.match(/\bgzip\b/)) {
    encoder = {
      hasEncoder     : true,
      contentEncoding: { 'content-encoding': 'gzip' },
      createEncoder  : zlib.createGzip
    }
  }

  response.writeHead(200, encoder.contentEncoding)

  if (encoder.hasEncoder) {
    stream = stream.pipe(encoder.createEncoder())
  }

  stream.pipe(response)

}).listen(1337)


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow