Como posso obter uma lista de retornos de chamada na fila de trabalho do Node? (ou, por que o Node não sai?)

84

Diz na página sobre do Node.js :

O Node sai do loop de eventos quando não há mais callbacks para executar.

Existe uma maneira de descobrir quais retornos de chamada estão impedindo a saída do Node?

Dmitry Minkovsky
fonte
2
essa é uma ótima pergunta ... a mesma que comecei a fazer ao estudar o loop de eventos ... como faço para ver o que? não tenho certeza por que as pessoas votariam nisso. ;)
tbarbe

Respostas:

90

Você pode usar process._getActiveHandles()eprocess._getActiveRequests()

Veja esta discussão na lista de discussão node.js.

atualização: há um bom pacote para isso - https://github.com/mafintosh/why-is-node-running

Andrey Sidorov
fonte
2
Muito obrigado, era isso que eu procurava. No início de # Node.js no Freenode alguém estava tentando lembrar essas chamadas e coun't bastante chegar lá: "totally spacing on the name, it's like "process._getOpenHandles()" or something equally hard to remember". Eu estava procurando no Google tentando encontrar a chamada real e não consegui. Obrigado novamente.
Dmitry Minkovsky
2
Eu não conseguia lembrar os nomes também - usei o nó repl, digitei process._ + preenchimento da guia :)
Andrey Sidorov
Hah, eu não tinha pensado em REPL autocompletar, que obviamente é a melhor maneira de fazer isso. Eu tinha olhado node_globals.jse não encontrei. Agora estou fazendo um grep na base de código do nó, sabendo o que procurar e descobrindo que eles estão definidos em node.cc. process._getActiveHandles () é src/node.cc:2345: NODE_SET_METHOD(process, "_getActiveHandles", GetActiveHandles);Hah! Excelente.
Dmitry Minkovsky
@dimadima há um downvote entre pergunta e resposta agora. Em primeiro lugar, não é "pessoas", é "uma pessoa". E StackOverflow é um dos 100 sites mais visitados do mundo, você realmente não deveria levar isso tão a sério que alguém, em algum lugar, não gostasse muito desta pergunta.
Djechlin de
2
existe alguma documentação oficial sobre essas funções?
tbarbe
11

Há um módulo npm wtfnode para mostrar o que mantém o aplicativo nodejs em execução quando você envia SIGINT (ctrl-c) para ele.

Ele usa interno process._getActiveHandles()conforme mencionado na resposta de @andrey-sidrov. A vantagem de usar wtfnodeé que ele fornece uma saída fácil de ler.

Aleung
fonte
O process._getActiveHandles (). Length dá um total de todos os processos ou apenas para o processo onde é chamado
Shantanu Madane