Rejestrowanie synchroniczne wiąże się z dużą karą za wyniki, ponieważ może blokować. Czy istnieje autonomiczna biblioteka Ruby, która wykonuje rejestrację asynchroniczną (wydaje się, że log4r nie działa)? Czy mogę zmodyfikować standardowy program rejestrujący biblioteki, aby logować się asynchronicznie? Szukam czegoś podobnego do log4j: AsyncAppender - ale najlepiej implementacja, która używa bloków kodu Ruby, aby przesunąć jak najwięcej pracy do wątku tła, jak to tylko możliwe.Czy istnieje Asynchronous Logging Library dla Ruby?
Odpowiedz
wiem, że nie powinno naprawdę odpowiedzieć na własne pytanie, ale wydaje się, że wszystko jest proste w Ruby
require 'thread'
require 'singleton'
require 'delegate'
require 'monitor'
class Async
include Singleton
def initialize
@queue = Queue.new
Thread.new { loop { @queue.pop.call } }
end
def run(&blk)
@queue.push blk
end
end
class Work < Delegator
include MonitorMixin
def initialize(&work)
super work; @work, @done, @lock = work, false, new_cond
end
def calc
synchronize {
@result, @done = @work.call, true;
@lock.signal
}
end
def __getobj__
synchronize { @lock.wait_while { [email protected] } }
@result
end
end
Module.class.class_exec {
def async(*method_names)
method_names.each do |method_name|
original_method = instance_method(method_name)
define_method(method_name) do |*args,&blk|
work = Work.new { original_method.bind(self).call(*args,&blk) }
Async.instance.run { work.calc }
return work
end
end
end
}
I na moim przykładzie rejestrowania:
require 'Logger'
class Logger
async :debug
end
log = Logger.new STDOUT
log.debug "heloo"
Jako wartości zwracanych pracować, możesz użyć tego do prawie wszystkiego:
require "test/unit"
class ReturnValues < Test::Unit::TestCase
def do_it
5 + 7
end
async :do_it
def test_simple
assert_equal 10, do_it - 2
end
end
Doskonałe. Ekspresyjna natura Ruby nieustannie mnie zadziwia. Wspomniałeś o używaniu JRuby, więc masz potencjalnie prawdziwe wątki, ale używasz również dynamicznej ruby magic, więc jak dobrze JRuby radzi sobie ze wszystkimi dynamicznymi sztuczkami? Byłoby fajnie zobaczyć kilka benchmarków z JRuby i MRI obok siebie. – davidk01
Ładny kod! Lepiej być przy użyciu włókien/eventmachine. Wątki wykonają zadanie, ale są znacznie ważniejsze w MRI (i w przyszłości w JRuby) i wymagają zarządzania i synchronizacji. Myślę, że istnieje już streamer plików maszyn zdarzeń, który może być zbliżony do tego, co chcesz: http://stackoverflow.com/questions/2749503/what-is-the-best-way-to-read-files-in-an -eventmachine-based-app –
Nie osobiste doświadczenia z tym:
Swiftcore Analogger implementuje szybki asynchronicznego systemu rejestrowania programów Ruby oraz biblioteki klienta do wysyłania wiadomości z logowaniem do Proces Analogger.
Analogger akceptuje logi z wielu źródeł i może mieć wiele miejsc rejestrowania . Obecnie obsługiwane jest logowanie do pliku, do STDOUT lub do STDERR. Przyszła wersja może również obsługiwać logowanie do docelowego bazy danych .
Analogger zależy od EventMachine (http://rubyforge.org/projects/eventmachine) , aby zapewnić ramy dla komunikacji sieciowej, chociaż EM jest nieużywany do biblioteki klienta.
Wydaje się, że rejestrowanie asynchroniczne odbywa się w oddzielnym procesie - wolę rejestrowanie w trakcie procesu (tylko w innym wątku). –
Wbudowany klasy Logger jest już wątku bezpieczne
Chcę, aby komunikaty dziennika były zapisywane na dysku w osobnym wątku, więc jeśli IO blokuje to, nie spowalnia mojego głównego wątku. –
Zamówienie Dunder https://github.com/fonsan/dunder
Stworzyłem ten klejnot 6 miesięcy temu, że robi tylko to i więcej
- 1. Enterprise Library: Logging Block and Email
- 2. Ruby: KML Library?
- 3. Ruby Audio Library
- 4. Czy istnieje dobre opakowanie openCL dla Ruby?
- 5. Czy istnieje książka "Code Complete" dla Ruby?
- 6. Asynchronous CreateProcess?
- 7. C++ Library dla XMLRPC
- 8. Asynchronous Thread.Sleep()
- 9. GlassFish Logging
- 10. Python Logging setlevel
- 11. Angular2 Logging
- 12. Czy istnieje moduł podobny do LWP Perla dla Ruby?
- 13. Czy istnieje odpowiednik Pythona dla interpolacji ciągów Ruby?
- 14. Czy istnieje odpowiednik Array # find_index dla ostatniego indeksu w ruby?
- 15. Czy istnieje coś takiego jak MAMP dla Ruby on Rails?
- 16. SqlDataAdapter.Fill - Asynchronous approach
- 17. C# Asynchronous Sockets questions
- 18. Enterprise Library Logging nie loguje się do dziennika zdarzeń z ASP.NET
- 19. Silverlight Logging framework and/or best practices
- 20. Czy istnieje Regex Delete w Ruby?
- 21. Czy istnieje limit rozmiaru tablicy w ruby?
- 22. Czy istnieje alternatywa Pythona do biblioteki VCR w Ruby?
- 23. Przeniesienie okna GWT Logging
- 24. Ograniczenia Ruby dla Ruby
- 25. Czy istnieje kolorowy REPL dla Clojure?
- 26. Czy istnieje odpowiednik dplyr dla data.table :: rleid?
- 27. Logging programy Rust
- 28. Python Asynchronous Comprehensions - jak działają?
- 29. Patch Library From Clojars
- 30. Java Logging With Abstract Classes
Czy 'ruby' tłumaczy te dni nadal dość ham-nawleczone kiedy dochodzi do wielowątkowego kodu? Czy jest jeszcze olbrzymia blokada tłumacza, która jest kluczowym rdzennym kodem Ruby o pojedynczych wątkach? Jestem ciekawy, ponieważ, chyba że już korzystasz z frameworka takiego jak [eventmachine] (http://rubyeventmachine.com/), aby wymusić _all_ twoje IO na asynchroniczne, możesz nie widzieć żadnej korzyści z robienia tylko asynchronicznego rejestrowania . – sarnold
Zwykle używam JRuby, więc mam prawdziwe wątki Java (myślę) ... –
ooh;) To jest ważny powód, aby rozważyć użycie JRuby. Dzięki. – sarnold