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

ظهور الخطأ possible EventEmitter memory leak detected في node.js

Bassel Jhr

السؤال

بعد فترة من الزمن ظهر لي الخطأ التالي من طرف خادم الويب 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...