Pregunta

Estoy trabajando en una herramienta de compilación que lanza miles de procesos (compilaciones, enlaces, etc.). También distribuye ejecutables a máquinas remotas para que la compilación se pueda ejecutar en cientos de máquinas esclavas. Estoy implementando la inyección DLL para monitorear los procesos secundarios de mi proceso de compilación para que pueda ver que abrieron / cerraron los recursos que esperaba. De esa manera puedo saber si mis usuarios no están especificando la información de dependencia correctamente.

Mi pregunta es:

Tengo la inyección DLL funcionando pero no estoy tan familiarizado con la programación de Windows. ¿Cuál sería la mejor / más rápida forma de devolver la llamada al proceso de compilación principal con todos los millones de informes de archivos que generarán los hijos? He pensado en hacer que escriban en un zócalo sin bloqueo, pero me he estado preguntando si quizás tuberías / memoria compartida o COM sería mejor.

¿Fue útil?

Solución

Primero, dado que aparentemente se trata de comunicación entre máquinas, no solo dentro de una máquina, descartaría la memoria compartida de inmediato.

Pensaría mucho en tratar de minimizar la cantidad de datos en lugar de preocuparme mucho por la rapidez con la que puede enviarlos. En lugar de enviar millones de informes de E / S de archivo, agruparía unos kilobytes de esos datos (o algo en ese orden) y enviaría un hash de ese paquete. Con una elección cuidadosa del tamaño del paquete, debería poder reducir su transmisión de datos hasta el punto de que simplemente puede usar el método que le resulte más conveniente, en lugar de tratar de elegir el que sea más rápido.

Otros consejos

Si permanece en el mundo de Windows (ninguna de sus máquinas es Linux o lo que sea), las tuberías con nombre son una buena opción, ya que es rápido y se puede acceder a él a través del límite de la máquina. Creo que la memoria compartida está fuera de carrera, porque no puede cruzar el límite de la máquina. Com distribuido permite formular el contrato en IDL, pero creo que los mensajes XML a través de tuberías también están bien. Los mensajes xml tienen el beneficio de funcionar completamente independientes del canal. Si necesita linux más tarde, puede cambiar a tcp / ip transport y enviar sus mensajes xml.

Algunas técnicas adicionales con limitaciones:

Otro candidato olvidado pero atractivo es RPC (llamadas a procedimiento remoto). Muchos servicios de Windows confían en esto. Pero creo que es difícil programar RPC

Si está en la misma máquina y solo necesita enviar información de estado, puede registrar un mensaje de Windows a través de RegisterWindowMessage () y enviar mensajes desde SendMessage ()

aparte de todas las sugerencias de thomas, también puede usar una base de datos común para almacenar los resultados. Y si eso es demasiado lento, use una de las bases de datos de clave / valor más modernas (y más rápidas) (como tokyo cabinet / memcachedb / etc).

Esto parece una exageración para la tarea de verificar los archivos utilizados en una compilación. ¿Qué tal, simplemente escaneando los archivos de compilación? o capturar el resultado de las herramientas de compilación?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top