Question

Je travaille sur un outil de construction qui lance des milliers de processus (compilations, liens, etc.). Il distribue également les exécutables sur des machines distantes de manière à ce que la compilation puisse être exécutée sur des centaines de machines esclaves. J'implémente l'injection de DLL pour surveiller les processus enfants de mon processus de génération afin de pouvoir voir qu'ils ont ouvert / fermé les ressources auxquelles je m'attendais. De cette façon, je peux savoir si mes utilisateurs ne spécifient pas correctement les informations de dépendance.

Ma question est la suivante:

L’injection de DLL fonctionne, mais je ne connais pas très bien la programmation Windows. Quel serait le meilleur moyen / le plus rapide de rappeler le processus de génération parent avec les millions de rapports de fichiers io que les enfants vont générer? J'ai pensé les faire écrire dans un socket non bloquant, mais je me demandais si peut-être des pipes / mémoire partagée ou peut-être que COM serait mieux?

Était-ce utile?

La solution

Premièrement, étant donné que vous avez apparemment affaire à une communication entre ordinateurs, pas uniquement au sein d’un seul ordinateur, j’éliminerais immédiatement la mémoire partagée.

Je réfléchirais beaucoup à essayer de minimiser la quantité de données au lieu de trop m'inquiéter de la rapidité avec laquelle vous pouvez les envoyer. Au lieu d'envoyer des millions de rapports d'E / S de fichiers, je regrouperais quelques kilo-octets de ces données (ou quelque chose de cet ordre) et enverrais un hachage de ce paquet. Avec un choix judicieux de la taille du paquet, vous devriez être en mesure de réduire la transmission de vos données au point que vous pouvez simplement utiliser la méthode qui vous convient le mieux, au lieu d’essayer de choisir celle qui est la plus rapide.

Autres conseils

Si vous restez dans le monde Windows (aucune de vos machines n’est linux ou autre), les tubes nommés constituent un bon choix car ils sont rapides et accessibles de l’autre côté de la machine. Je pense que la mémoire partagée est hors de la course, car elle ne peut pas franchir les limites de la machine. Distributed com permet de formuler le contrat en IDL, mais je pense que les messages XML via des canaux sont également acceptables. Les messages XML ont l’avantage de fonctionner de manière totalement indépendante du canal. Si vous avez besoin de Linux plus tard, vous pouvez passer au transport TCP / IP et envoyer vos messages XML.

Quelques techniques supplémentaires avec des limitations:

Le RPC (appel de procédure à distance) est un autre candidat oublié, mais qui reste à la mode. Beaucoup de services Windows en dépendent. Mais je pense qu'il est difficile de programmer RPC

Si vous êtes sur le même ordinateur et que vous n’avez qu’à envoyer des informations sur votre statut, vous pouvez enregistrer un message Windows via RegisterWindowMessage () et envoyer des messages via SendMessage ()

Hormis toutes les suggestions de Thomas, vous pouvez également utiliser une base de données commune pour stocker les résultats. Et si cela est trop lent, utilisez l’une des bases de données clé / valeur les plus modernes (et rapides) (comme tokyo cabinet / memcachedb / etc).

Cela ressemble à beaucoup d’excès pour la tâche de vérification des fichiers utilisés dans une construction. Pourquoi ne pas analyser les fichiers de construction? ou capturer la sortie des outils de construction?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top