2012-04-07 1 views
8

documentation for write()는 말한다 : 거짓Node.js를 '쓰기 스트림과 드레인 이벤트

반환 커널 버퍼가 꽉 찼다는 것을 알리기 위해, 데이터는 미래에 발송됩니다.

drain 이벤트에 대한 문서

는 말한다 : 쓰기() 메소드 후

가 false를 반환,이 이벤트가 다시 작성하는 안전하다는 것을 나타 내기 위해 방출된다.

그 의미는 무엇입니까? 다시 쓰기 전에 drain 이벤트를 기다려야합니까? 내가 쓰려고했던 데이터에는 어떤 변화가 있었습니까? 잃어버린거야? drain 이벤트를 기다리지 않고 쓰기를 호출하면 어떻게됩니까?

답변

6

write()은 안전하게 반환 값을 신경 쓰지 않고도 호출 할 수 있습니다. 노드는 커널 버퍼가 꽉 찼을 때 모든 쓰기 호출을 버퍼링하고 예상대로 순서대로 밀어 넣습니다. 은 다시 쓰기 전에 'drain' 이벤트를 기다려야합니다.

선택적으로 반환 값 write()을 확인한 다음 버퍼에 가득 찼음을 스트림에 쓰는 것을 알릴 수 있습니다. 이것은 정확히 Stream#pipe() does입니다.

그래서 일반적으로, 단지 Stream#pipe()을 사용하고있는 모든 케이크는 당신을 위해 처리를 촬영 : 당신이`process.exit를 호출하면 어떻게됩니까

+1

()'은'res.write' 여전히 사용자 메모리에 버퍼링되는 동안 (즉, 커널 버퍼로 플러시되지 않음)? 응답이 없어지나요? – Emmett

+0

@Emmett 예, 버퍼링 된 쓰기 호출이 남아있을 때'process.exit() '를 호출하면 플러시 대상 데이터가 손실됩니다. – TooTallNate

+1

"반환 값에 신경 쓰지 않고 write()'를 호출하는 것은 전적으로 안전하지 않습니다." [현재 문서] (https://nodejs.org/dist/v8.4.0/docs/api/stream.html)는 다음과 같이 말합니다 : _ "유출되지 않은 스트림에서 write()를 호출하는 것이 허용되는 동안, Node .js는 최대 메모리 사용량이 발생할 때까지 모든 기록 된 청크를 버퍼링합니다.이 시점에서 무조건 중단됩니다. 중단되기 전에 메모리 사용량이 많으면 가비지 수집기 성능이 떨어지고 RSS가 많이 발생합니다 (일반적으로 시스템에 다시 릴리스되지 않음). 메모리가 더 이상 필요하지 않으면). "_ 참조 : https://stackoverflow.com/q/37579605 – TachyonVortex