gpt4 book ai didi

ruby - 是否有适用于 Ruby 的异步日志记录库?

转载 作者:数据小太阳 更新时间:2023-10-29 06:41:15 25 4
gpt4 key购买 nike

同步日志记录会导致很大的性能损失,因为它可能会阻塞。是否有一个独立的 Ruby 库可以进行异步日志记录(log4r 似乎没有)?我可以修改标准库记录器以异步记录吗?我正在寻找类似 log4j 的 AsyncAppender 的东西- 但最好是使用 Ruby 的代码块将尽可能多的工作转移到后台线程的实现。

最佳答案

我知道你不应该真正回答你自己的问题,但在 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 { !@done } }
@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
}

对于我的日志记录示例:

require 'Logger'
class Logger
async :debug
end
log = Logger.new STDOUT
log.debug "heloo"

由于返回值有效,您几乎可以将其用于任何事情:

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

关于ruby - 是否有适用于 Ruby 的异步日志记录库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6499654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com