【问题标题】:MaxListenersExceededWarning when using socket.pipe recursively递归使用 socket.pipe 时的 MaxListenersExceededWarning
【发布时间】:2017-12-12 14:09:55
【问题描述】:

在我的 Node.JS 应用程序中,我需要通过 TCP 连接递归地执行 writer 函数。我就是这样做的:

var net = require('net');
const commonConfig = require('../config.common')

var server = net.createServer(function(socket) {

    let writer  = () => {
        socket.write(Date.now() + '\n\r')
        socket.pipe(socket)
        setTimeout(writer, 1000)
    }
    writer()
});

server.listen(commonConfig.TCP_PORT, commonConfig.TCP_ADDR);

但是,我收到以下警告:

(node:4497) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 end listeners added. Use emitter.setMaxListeners() to increase limit (node:4497) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 finish listeners added. Use emitter.setMaxListeners() to increase limit (node:4497) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 unpipe listeners added. Use emitter.setMaxListeners() to increase limit (node:4497) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 drain listeners added. Use emitter.setMaxListeners() to increase limit (node:4497) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 data listeners added. Use emitter.setMaxListeners() to increase limit (node:4497) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit (node:4497) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 close listeners added. Use emitter.setMaxListeners() to increase limit

这些是由什么引起的?如何在不破坏我的功能的情况下解决这些问题?

【问题讨论】:

    标签: node.js sockets recursion memory-leaks


    【解决方案1】:

    我最近遇到了类似的问题,管道导致最大侦听器警告。我没有使用事件侦听器,而是严格管理资源。当我添加太多可写管道来接收来自同一源的数据时,例如sourcePipe.pipe(writablePipe),nodejs 会给出警告。

    使用 --trace-warnings 标志启动我的应用程序可以提供更多详细信息,具体告诉我问题发生在哪里,这正是管道发生的代码。 node --trace-warnings app.js。将该标志传递给您的应用可能有助于为您提供有关问题的更多详细信息。

    (node:5676) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 data listeners added. Use emitter.setMaxListeners() to increase limit
    at _addListener (events.js:281:19)
    at Mp4Frag.addListener (events.js:298:10)
    at Mp4Frag.Readable.on (_stream_readable.js:775:35)
    at Mp4Frag.Readable.pipe (_stream_readable.js:638:7)
    at Socket.socket.on (L:\WebstormProjects\ffmpeg-streamer\sockets\mse.js:83:33)
    at emitOne (events.js:115:13)
    at Socket.emit (events.js:210:7)
    at L:\WebstormProjects\ffmpeg-streamer\node_modules\socket.io\lib\socket.js:513:12
    at _combinedTickCallback (internal/process/next_tick.js:131:7)
    at process._tickCallback (internal/process/next_tick.js:180:9)
    

    它指向mse.js文件的第83行,即mp4frag.pipe(writable);

    我对此感到困惑,因为我知道这不是因为我有任何未处理的侦听器导致内存泄漏。我想我们有理由增加最大听众数限制,因为我们已经尽职尽责。

    在我的源管道上,我添加了一些代码 mp4frag.setMaxListeners(20);。现在,当我超过这个数字时,我会收到警告 MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 21 end listeners added. Use emitter.setMaxListeners() to increase limit 告诉我正在使用我的设置值 20

    【讨论】:

      猜你喜欢
      • 2018-10-01
      • 2012-12-25
      • 2019-10-17
      • 1970-01-01
      • 2023-03-02
      • 2018-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多