2017-12-12 19 views
1

Node.JS 앱에 TCP 연결을 통해 writer 함수를 재귀 적으로 실행해야합니다. 이것은 내가 그것을하고 있어요 방법은 다음과 같습니다MaxListenersExceeded 재귀 적으로 socket.pipe를 사용할 때의 경고

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

어떻게 내 기능을 파괴하지 않고 다음을 해결할 수 있습니까?

답변

0

최근에 파이핑으로 인해 최대 리스너 경고가 발생하여 비슷한 문제가 발생했습니다. 이벤트 리스너를 사용하지는 않지만 엄격하게 리소스를 파이핑합니다. sourcePipe.pipe(writablePipe)과 같이 동일한 소스의 데이터를 수신 할 수있는 쓰기 가능한 파이프를 너무 많이 추가하면 nodejs가 경고를 표시합니다.

--trace-경고 플래그 내 응용 프로그램을 실행하면 문제가 배관이 일어나고있는 코드가 정확히 어떤 발생하는 특정 위치를 말해 더 자세한 정보를 제공합니다. 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) 

그것은 내가 메모리 누수의 원인이 처리되지 않은 청취자를 가지고 있기 때문에 그것이 아니라는 것을 알고 있기 때문에 이것에 의해 mp4frag.pipe(writable);

내가 난처한 상황에 빠진되어있는 mse.js 파일의 83 행으로 지적한다. 나는 우리가 우리의 실사를했기 때문에 최대 청취자 한계를 증가시키는 것이 정당화된다고 생각한다.

내 소스 파이프에서 일부 코드 mp4frag.setMaxListeners(20);을 추가했습니다. 이제 그 수를 초과하면 MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 21 end listeners added. Use emitter.setMaxListeners() to increase limit 경고 메시지가 표시되어 내 설정 값 이 사용 중임을 알 수 있습니다.