Как войти с помощью Ruby и eventmachine?

Я пишу приложение, используя Ruby и библиотеку Eventmachine. Мне очень нравится идея неблокирующего ввода-вывода и систем, управляемых событиями, проблема, с которой я сталкиваюсь, - это ведение журнала. Я использую стандартную библиотеку регистратора Ruby. Дело не в том, что ведение журнала занимает вечность, но кажется, что это не должно блокировать, и оно блокируется. Есть ли где-нибудь библиотека, которая расширяет стандартную реализацию регистратора Ruby, чтобы она была неблокирующей, или я должен просто вызывать EM::defer для моих вызовов журналирования? Есть ли способ заставить eventmachine сделать это за меня?


person Justin    schedule 11.11.2010    source источник
comment
Вы пробовали делегировать ведение журнала в новый поток?   -  person AndrewKS    schedule 12.11.2010
comment
Это то, что EM::defer позволит мне сделать, но я ищу способ избежать этого.   -  person Justin    schedule 13.11.2010


Ответы (2)


В итоге я обернул регистратор в одноэлементный класс, который запускал поток и имел очередь FIFO. Ведение журнала сбрасывало информацию журнала в очередь, а поток просто зацикливался, извлекая материал из очереди и используя настоящий регистратор для его регистрации. На самом деле это не шаблон реактора, но он также не сожрет мой пул потоков EM.

С этим синглтоном у вас может быть только один регистратор, но вот что я сделал на github.

person Justin    schedule 18.11.2010
comment
Ссылка на то, что я выложил на github. Вы заставили меня пойти с открытым исходным кодом! знак равно - person Justin; 23.06.2011
comment
Есть ли гем ведения журнала, который не порождает потоки, а вместо этого использует собственную асинхронную обработку с обратными вызовами? - person Wolfram Arnold; 08.07.2013

Если вы работаете в системе с системным журналом, вы можете взглянуть на EM-Syslog.

person dj2    schedule 14.11.2010