2010-12-08 75 views
1

Bien sûr, il y a la manière évidente d'utiliser "synchronized". Mais je crée un système conçu pour fonctionner sur plusieurs cœurs et écrire dans ce fichier plusieurs fois à la même milliseconde. Donc, je crois que l'utilisation de la synchronisation nuira gravement aux performances. Je pensais utiliser la classe Pipe de Java (mais je ne sais pas si cela peut aider) ou chaque thread écrit dans un fichier différent et un thread supplémentaire de collecte ces écritures, créant le résultat final. Je devrais mentionner que l'ordre des écritures n'est pas important et il est timestamped dans nanotime de toute façon. Quelle est la meilleure idée de ces deux? avoir d'autres suggestions? merci.Synchronisation de plusieurs threads écrivant dans le même fichier java

+0

Vous devez spécifier le type de vitesse que vous recherchez, le débit ou la latence. Avez-vous besoin d'écrire 10k m/s ou un message donné en 1ms? Aussi, si vous vous souciez de la fiabilité des écritures sur le disque (pouvez-vous vous permettre de perdre des écritures différées sur un crash de processus). – DaveC

Répondre

2

L'utilisation d'une sorte de synchronisation (par exemple, des mutex uniques) est assez facile à mettre en œuvre. Si j'avais suffisamment de RAM, je créerais une file d'attente de pour chaque thread de production de journaux, et un thread de consignation pour lire toutes les files d'attente de manière circulaire (ou quelque chose comme ça) .

1

Pas une réponse directe à votre question, mais le projet logback a des facilités de synchronisation intégrées pour écrire dans le même fichier à partir de différents threads, de sorte que vous pouvez essayer de l'utiliser si cela convient à vos besoins, ou au moins regarde son code source. Comme il est construit pour la vitesse, je suis sûr que la mise en œuvre ne doit pas être considérée comme acquise.

1

Vous avez raison de vous inquiéter, vous ne pourrez pas faire en sorte que tous les threads écrivent dans le même fichier sans problème de performances. Quand j'ai eu ce problème (écriture de ma propre journalisation, antérieure à Log4j), j'ai créé deux tampons de taille fixe en mémoire et tous les threads de production écrivent dans un tampon tandis qu'un thread consommateur dédié lisait depuis l'autre tampon et a écrit dans un fichier. De cette façon, les threads d'écriture devaient uniquement se synchroniser lors de l'obtention et de l'incrémentation de l'index dans la mémoire tampon et lors de l'échange des tampons, et ils n'étaient bloqués que lorsque le tampon courant était plein. C'était lourd de mémoire mais rapide. Pour d'autres idées, vous pourriez vérifier comment les enregistreurs comme Log4j et Logback fonctionnent, ils auraient dû résoudre ce problème.

1

Essayez d'utiliser JMS. Tous vos processus s'exécutant sur des machines différentes peuvent envoyer un message JMS au lieu d'écrire dans un fichier. Créez un seul récepteur de file d'attente qui reçoit les messages et les écrit dans le fichier. Log4J a déjà cette fonctionnalité: voir JMSAppender.