当在Ruby EventMachine中创建PeriodicTimer时,它是非常不准确的,而且似乎是随机的和不正确的。我想知道有没有办法解决这个问题,或者我可能用错了方法。
下面是一个例子。我有一个PeriodicTimer,它每10秒拉取一个全局数组(其中包含mysql语句)并执行mysql命令。当像这样运行时,PeriodicTimer可能每隔几分钟就执行一次,或者在一段时间后完全停止执行,以及其他奇怪的异常情况。
Eventmachine::run {
EM::PeriodicTimer.new(10) {
mysql_queue = $mysql_queue.dup
$mysql_queue = []
mysql_queue.each do |command|
begin
Mysql.query(command)
rescue Exception => e
puts "Error occured.. #{e} #{command}"
end
end
}
# Here follow random tasks/loops that are adding mysql statements to $mysql_queue
100_000.times {
if ...
$mysql_queue << "INSERT INTO `...` (...) VALUES (...);"
end
}
...
# ...
}如果你想知道,我喜欢使用这样的"Mysql队列“,因为它防止了竞争条件。实际上,这实际上是一个小型的TCP/IP客户端,它处理多个并发连接并执行mysql命令来记录各种操作。
发布于 2012-10-28 20:44:32
你希望这段代码能做什么?为什么你认为计时器会被调用,如果你不把控制传给EM循环?尝试将100_000循环拆分成更小的部分:
10_000.times do
EM.next_tick do
10.times do
if ...
$mysql_queue << "INSERT INTO `...` (...) VALUES (...);"
end
end
end
end在这里使用全局$不是一个好主意,如果你使用的线程可能会访问它或者不会访问它,那么它就不是很干净。
https://stackoverflow.com/questions/13086289
复制相似问题