2010-11-11 6 views
6

J'écris une application en utilisant Ruby et la bibliothèque Eventmachine. J'aime vraiment l'idée de systèmes d'E/S non bloquants et d'événements, le problème que je rencontre est la journalisation. J'utilise la bibliothèque de journalisation standard de Ruby. Ce n'est pas que la journalisation prend une éternité, mais il semble que quelque chose ne devrait pas bloquer et c'est le cas. Existe-t-il une bibliothèque quelque part qui étende l'implémentation de l'enregistreur standard de Ruby pour qu'elle ne soit pas bloquante ou devrais-je simplement appeler EM :: defer pour mes appels de journalisation? Y a-t-il un moyen pour que eventmachine fasse ça pour moi déjà?Comment se connecter avec Ruby et eventmachine?

+0

Avez-vous essayé de déléguer la journalisation à un nouveau sujet? – AndrewKS

+0

C'est ce que EM :: defer me permettrait de faire, mais je cherche un moyen de l'éviter. – Justin

Répondre

3

J'ai fini par envelopper l'enregistreur dans une classe singleton qui a commencé un fil et avait une file d'attente FIFO. La consignation transfère les informations du journal dans la file d'attente et le thread se contente d'effectuer une boucle pour extraire les données de la file d'attente et utiliser le consignateur réel pour les consigner. Pas vraiment le modèle de réacteur mais il ne mâche pas non plus ma piscine de fil EM.

Avec ce singleton, vous ne pouvez avoir qu'un seul enregistreur mais voici ce que j'ai fait sur github.

+0

pourriez-vous partager du code? –

+1

Lien vers ce que j'ai mis en place sur github. Tu m'as amené à aller open source! =) – Justin

+0

Existe-t-il une gem de consignation qui ne génère pas de threads et utilise à la place un traitement asynchrone natif avec des rappels? –

1

Si vous êtes sur un système avec Syslog vous pouvez jeter un oeil à EM-Syslog

Questions connexes