Domanda

Sto lavorando a uno strumento di compilazione che avvia migliaia di processi (compilazioni, collegamenti ecc.). Distribuisce anche eseguibili su macchine remote in modo che la build possa essere eseguita su centinaia di macchine slave. Sto implementando l'iniezione DLL per monitorare i processi figlio del mio processo di compilazione in modo da poter vedere che hanno aperto / chiuso le risorse che mi aspettavo. In questo modo posso dire se i miei utenti non stanno specificando correttamente le informazioni sulla dipendenza.

La mia domanda è:

Ho fatto funzionare l'iniezione DLL ma non ho molta familiarità con la programmazione di Windows. Quale sarebbe il modo migliore / più veloce per richiamare al processo di generazione principale con tutti i milioni di report di file io che i bambini genereranno? Ho pensato di farli scrivere su un socket non bloccante, ma mi chiedevo se forse le pipe / la memoria condivisa o la COM fossero migliori?

È stato utile?

Soluzione

Innanzitutto, poiché apparentemente hai a che fare con la comunicazione tra macchine, non solo all'interno di una macchina, escluderei immediatamente la memoria condivisa.

Penserei seriamente di provare a minimizzare la quantità di dati invece di preoccuparmi molto della velocità con cui puoi inviarli. Invece di inviare milioni di report I / O su file, raggrupperei alcuni kilobyte di quei dati (o qualcosa su quell'ordine) e invierei un hash di quel pacchetto. Con un'attenta scelta delle dimensioni del pacchetto, dovresti essere in grado di ridurre la trasmissione dei dati al punto da poter semplicemente utilizzare qualsiasi metodo tu ritenga più conveniente, anziché cercare di scegliere quello più veloce.

Altri suggerimenti

Se rimani nel mondo di Windows (nessuna delle tue macchine è Linux o altro), named pipe è una buona scelta, perché è veloce e può essere raggiunta oltre il limite della macchina. Penso che la memoria condivisa sia fuori gara, perché non può attraversare il confine della macchina. Com distribuito consente di formulare il contratto in IDL, ma penso che anche i messaggi XML tramite pipe siano ok. I messaggi XML hanno il vantaggio di funzionare in modo completamente indipendente dal canale. Se hai bisogno di Linux in seguito, puoi passare al trasporto tcp / ip e inviare i tuoi messaggi xml.

Alcune tecniche aggiuntive con limitazioni:

Un altro candidato dimenticato ma caldo è RPC (chiamate di procedura remota). Molti servizi Windows si basano su questo. Ma penso che sia difficile programmare RPC

Se ti trovi sullo stesso computer e devi solo inviare alcune informazioni sullo stato, puoi registrare un messaggio di Windows tramite RegisterWindowMessage () e inviare messaggi tramite SendMessage ()

oltre a tutti i suggerimenti di Thomas, potresti anche usare un database comune per archiviare i risultati. E se è troppo lento, usa uno dei database chiave / valore più moderni (e veloci) (come tokyo cabinet / memcachedb / etc).

Sembra un po 'eccessivo per il compito di verificare i file usati in una build. Che ne dici di scansionare solo i file di build? o catturare l'output dagli strumenti di compilazione?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top