اذهب إلى المحتوى

السؤال

نشر

بعد فترة من الزمن ظهر لي الخطأ التالي من طرف خادم الويب node.js:

(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace: 
    at EventEmitter.<anonymous> (events.js:139:15)
    at EventEmitter.<anonymous> (node.js:385:29)
    at Server.<anonymous> (server.js:20:17)
    at Server.emit (events.js:70:17)
    at HTTPParser.onIncoming (http.js:1514:12)
    at HTTPParser.onHeadersComplete (http.js:102:31)
    at Socket.ondata (http.js:1410:22)
    at TCP.onread (net.js:354:27)

أين يجب أن استخدم التابع emitter.setMaxListeners ؟ وما هو العدد الأعظمي الذي يمكنني الوصول إليه؟

Recommended Posts

  • 1
نشر

التحذير موجود لتنبيهك قد لا تكون بحاجة لزيادة الحد الأقصى بل للانتباه لماذا يضاف الكثير من ال listeners الى مصدر الأحداث لديك،

قد يكون في نظامك مكان تريد الاستماع فيه الى حدث معين أو خطأ لنفس الحدث لكنك لا تزيل الدوال الممررة والمنتهي عملها

stream.on('data', onData)
stream.on('error', onError)
stream.on('end', cleanup) // التنظيف عند الانتهاء أيضا

// توابع معالجة البيانات و الأخطاء
// يمكن الإشارة اليها لاحقا لتنظيفها حال الانتهاء
function onData() {
  cleanup()
  // ..
}

function onError(err) {
  cleanup()
  // ..
}

function cleanup() {
  // إزالة كل التوابع التي أضفناها سابقا لتجنب تسريب الذاكرة
  stream.removeListener('data', onData)
  stream.removeListener('error', onerror)
  stream.removeListener('end', cleanup)
}

أما في حال كنت متأكد من العدد التقريبي للدوال التي ستستمع للأحداث يمكنك زيادتها كي يكون التنبيه ذا فائدة حين يتكرر

 

stream.setMaxListeners(20)

 

  • 1
نشر (معدل)

من خلال emitter.setMaxListeners(n) بحيث n هي عدد صحيح ويعيد <EventEmitter> وبشكل افتراضي ، سيقوم EventEmitters بطباعة تحذير إذا تمت إضافة أكثر من 10 مستمعين "listeners" لحدث معين.
لكن تسمح الدالة emitter.setMaxListeners بتعديل ذلك حيث يمكنك ضبطه على Infinity (أو 0) للإشارة إلى عدد غير محدود من المستمعين.
مثال:

const emitter = new EventEmitter()
emitter.setMaxListeners(100)
//limit أو 0 لإيقاف ال
emitter.setMaxListeners(0)

يتم ضبطه على 10 بشكل افتراضي لأن هذا يساعد في تجنب الوصول إلى  حالة Memory leak" تسرب الذاكرة"  (الاستهلاك غير المتعمد للذاكرة المؤقتة "ram" في الحاسوب، بواسطة برنامج حاسوب، حيث يفشل البرنامج في إفراغ الذاكرة بعد الانتهاء من استخدامه).

تم التعديل في بواسطة Ali Haidar Ahmad
ملاحظة:
  • 1
نشر

ما يظهر لديك ليس حطأ, بل تحذير ويظهر هذا التحذير لسبب ما,ربما يحتوي الكود الخاص بك على خطأ, لنفترض لديك هذا الكود


var Logger = require('./Logger.js');

for (var i = 0; i < 11; i++) {
    Logger.on('error', function (err) {
        console.log('error writing log: ' + err)
    });

    Logger.writeLog('Hello');
}

الطريقة الصحيحة لإضافة المستمع (listeners) :


Logger.on('error', function (err) {
    console.log('error writing log: ' + err)
});

for (var i = 0; i < 11; i++) {
    Logger.writeLog('Hello');
}

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...