Pergunta

Estou a trabalhar em uma ferramenta de construção, que lança milhares de processos (compila, links etc). Também distribui executáveis ??para computadores remotos para que a construção pode ser executado em frente 100s de máquinas escravas. Estou implementando injeção de DLL para monitorar os processos filhos do meu processo de compilação para que eu possa ver que eles aberto / fechado os recursos que eu esperava-los para. Dessa forma posso saber se meus usuários não está especificando informações de dependência corretamente.

A minha pergunta é:

Eu tenho o trabalho injeção de DLL, mas não estou tão familiarizado com janelas de programação. Qual seria a melhor maneira / mais rápida de retorno de chamada para o processo de construção dos pais com todos os milhões de arquivo io relatos de que as crianças vão estar gerando? Já pensou em tê-los escrever a um soquete sem bloqueio, mas estive pensando se talvez tubos / memória compartilhada ou talvez COM seria melhor?

Foi útil?

Solução

Em primeiro lugar, desde que você está aparentemente lida com a comunicação entre máquinas, não apenas dentro de uma máquina, eu descartar memória compartilhada imediatamente.

Eu acho difícil sobre a tentativa de minimizar a quantidade de dados em vez de preocupar-se muito sobre o quão rápido você pode enviá-lo. Em vez de enviar milhões de relatórios de I / O de arquivos, eu lote juntos alguns kilobytes de que os dados (ou algo em que ordem) e envia um hash desse pacote. Com uma escolha cuidadosa do tamanho do pacote, você deve ser capaz de reduzir a sua transmissão de dados para o ponto que você pode simplesmente usar qualquer método que você achar mais conveniente, ao invés de tentar escolher o que é o mais rápido.

Outras dicas

Se você ficar no mundo do windows (Nenhum de suas máquinas é Linux ou qualquer outro) pipes nomeados é uma boa escolha, porque é rápido e podem ser acessados ??através do limite da máquina. Eu acho que a memória compartilhada está fora da corrida, porque ele não pode cruzar a fronteira máquina. Distribuído com permite formular o contrato em IDL, mas eu acho mensagens XML através de tubos também estão ok. As mensagens XML têm o benefício de trabalhar completamente independente do canal. Se yo necessidade linux mais tarde você pode mudar para tcp transporte / ip e enviar suas mensagens XML.

Algumas técnicas adicionais com limitações:

Outro candidato esquecido, mas quente é RPC (chamadas de procedimento remoto). Lote de serviços do Windows dependem deste. Mas eu acho que é difícil RPC programa

Se você estiver na mesma máquina e você só precisa enviar alguma informação de status, você pode regisier uma mensagem janelas via RegisterWindowMessage () e mensagens de envio vie SendMessage ()

Além de todas as sugestões de thomas, você pode também apenas usar um banco de dados comum para armazenar os resultados. E se isso é muito lento utilização das bases de dados de chave / valor mais moderno (e rápido) (como Tokyo Cabinet / memcachedb / etc).

Isso soa como um monte de exagero para a tarefa de verificar os arquivos usados ??em uma compilação. Que tal, apenas a digitalização dos arquivos de compilação? ou capturar a saída das ferramentas de compilação?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top