El registro síncrono incurre en una gran penalización de rendimiento ya que puede bloquear. ¿Hay una biblioteca independiente de Ruby que realice el registro asincrónico (log4r no parece)? ¿Puedo modificar el registrador de la biblioteca estándar para que se registre de manera asíncrona? Estoy buscando algo como log4j's AsyncAppender, pero preferiblemente una implementación que hace uso de los bloques de código de Ruby para cambiar tanto trabajo como sea posible.¿Hay una biblioteca de registro asincrónico para Ruby?
Respuesta
Sé que en realidad no debería responder a su propia pregunta, pero parece que todo es fácil en rubí:
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
}
Y para mi ejemplo de registro:
require 'Logger'
class Logger
async :debug
end
log = Logger.new STDOUT
log.debug "heloo"
Como valores de retorno trabajo, puede usar esto para casi cualquier cosa:
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
Excelente. La naturaleza expresiva de Ruby constantemente me sorprende. Mencionaste usar JRuby para que potencialmente tengas hilos reales pero también estás usando mucha magia dinámica de rubí. ¿Qué tan bien JRuby se enfrenta a todos los trucos dinámicos? Sería genial ver algunos puntos de referencia con JRuby y MRI uno al lado del otro. – davidk01
Buen código! Tal vez sea mejor usar fibras/eventomaquina. Los hilos harán el trabajo, pero son mucho más pesados en MRI (y en el futuro en JRuby) y requieren gestión y sincronización. Creo que ya hay un transmisor de archivos de máquina de evento que podría estar cerca de lo que desea: http://stackoverflow.com/questions/2749503/what-is-the-best-way-to-read-files-in-an -eventmachine-based-app –
Sin experiencia personal con que:
El Swiftcore Analogger implementa un sistema rápido asíncrono tala para los programas de Ruby, así como la biblioteca de cliente para el envío de mensajes de registro a la Proceso analógico.
Analogger aceptará registros de múltiples fuentes y puede tener múltiples destinos de registro . Actualmente, se admite el inicio de sesión en un archivo, en STDOUT o en STDERR. Una futura revisión también puede admitir el registro en un destino de base de datos .
Analogger depende de EventMachine (http://rubyforge.org/projects/eventmachine) de establecer un marco para las comunicaciones de red, aunque EM es no se utilizan para la biblioteca cliente.
Esto parece hacer el registro asincrónico en un proceso separado por completo. Prefiero el registro en proceso (solo en un hilo diferente) –
El construido en la clase Logger ya está seguro para subprocesos
Quiero que los mensajes de registro se escriban en el disco en un hilo separado, por lo que si IO bloquea no ralentiza mi hilo principal. –
Pedido Dunder https://github.com/fonsan/dunder
creé esta joya hace 6 meses que hace precisamente esto y más
- 1. Uso de msmq para el registro asincrónico
- 2. Biblioteca de registro para C
- 3. Biblioteca de gráficos para Ruby
- 4. ¿Hay una biblioteca de estadísticas para PHP?
- 5. ¿Hay una biblioteca de Cálculo para JavaScript?
- 6. ¿Hay una biblioteca de MapReduce para Delphi?
- 7. ¿Hay una biblioteca de hashmap para JavaScript?
- 8. Biblioteca de dibujo para Ruby
- 9. ¿Hay una manera genérica de sincronizar un método asincrónico?
- 10. ¿Hay una fachada de registro para .NET World?
- 11. ¿Hay una manera fácil de instalar la biblioteca Lisp, como ruby gem (Ruby) o easy_install (Python)?
- 12. ¿Hay una biblioteca LINQ para C++?
- 13. ¿Hay una biblioteca YAML nativa para iPhone?
- 14. ¿Hay una biblioteca AES para clojure?
- 15. ¿Hay una biblioteca Telnet para JavaScript?
- 16. ¿Hay una buena biblioteca yaml para Android?
- 17. ¿Hay una biblioteca AJAX para Codeigniter
- 18. ¿Hay una biblioteca similar a lxml o nokogiri para Java?
- 19. ¿Hay una biblioteca Java para esteganografía?
- 20. registro en una biblioteca de C#
- 21. ¿Biblioteca de Git para Ruby o Python?
- 22. mejor biblioteca de registro para C++
- 23. Biblioteca C++ para analizar el registro
- 24. ¿Hay una biblioteca para hacer CSS spriting automáticamente?
- 25. Windows Runtime: ¿Incluye una biblioteca de registro?
- 26. ¿Hay una biblioteca de Ruby que pueda poner una matriz de matrices en una tabla ascii?
- 27. PHP buena biblioteca de registro?
- 28. Establecimiento de una 'categoría' en el registro de la biblioteca Enterprise .NET (para registro de eventos)
- 29. Excepciones de registro automático en Ruby
- 30. ¿Hay una biblioteca/gema de Ruby que genere una URL basada en un conjunto de parámetros?
son 'intérpretes ruby' estos días todavía bastante desjarretaron cuando se trata de código multihilo? ¿Todavía hay un bloqueo de intérprete gigante que codifica Ruby nativo de un único subproceso? Tengo curiosidad porque, a menos que ya estés usando un framework como [eventmachine] (http://rubyeventmachine.com/) para forzar que _todo_ tu IO sea asincrónico, es posible que no veas ningún beneficio al hacer solo el registro asincrónico . – sarnold
Suelo usar JRuby, así que tengo hilos de Java reales (creo) ... –
ooh;) esa es una razón de peso para considerar usar JRuby, entonces. Gracias. – sarnold