首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby EventMachine PeriodicTimer chaos

Ruby EventMachine PeriodicTimer chaos
EN

Stack Overflow用户
提问于 2012-10-26 19:42:02
回答 1查看 747关注 0票数 0

当在Ruby EventMachine中创建PeriodicTimer时,它是非常不准确的,而且似乎是随机的和不正确的。我想知道有没有办法解决这个问题,或者我可能用错了方法。

下面是一个例子。我有一个PeriodicTimer,它每10秒拉取一个全局数组(其中包含mysql语句)并执行mysql命令。当像这样运行时,PeriodicTimer可能每隔几分钟就执行一次,或者在一段时间后完全停止执行,以及其他奇怪的异常情况。

代码语言:javascript
复制
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命令来记录各种操作。

EN

回答 1

Stack Overflow用户

发布于 2012-10-28 20:44:32

你希望这段代码能做什么?为什么你认为计时器会被调用,如果你不把控制传给EM循环?尝试将100_000循环拆分成更小的部分:

代码语言:javascript
复制
10_000.times do
  EM.next_tick do
    10.times do
      if ...
        $mysql_queue << "INSERT INTO `...` (...) VALUES (...);"
      end
    end
  end
end

在这里使用全局$不是一个好主意,如果你使用的线程可能会访问它或者不会访问它,那么它就不是很干净。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13086289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档