Ruby on rails 我们如何在Memcached读取上阻止rubyonrails,这样它就不会占用CPU?

Ruby on rails 我们如何在Memcached读取上阻止rubyonrails,这样它就不会占用CPU?,ruby-on-rails,ruby,asynchronous,memcached,parallel-processing,Ruby On Rails,Ruby,Asynchronous,Memcached,Parallel Processing,我们有一个守护进程,它扫描一个表中的脏位,然后将脏行批量调度到延迟的_作业。为了避免从dirty=1的数据中选择常量,我们设置了一个memcached屏障,它包装了表扫描,如 loop do # daemon until Rails.cache.fetch("have_dirty_rows") do end page = 1 loop do # paginate dirty rows dirty_batch = paginate(#:select

我们有一个守护进程,它扫描一个表中的脏位,然后将脏行批量调度到延迟的_作业。为了避免从dirty=1的数据中选择常量,我们设置了一个memcached屏障,它包装了表扫描,如

   loop do # daemon
     until Rails.cache.fetch("have_dirty_rows") do end
     page = 1
     loop do # paginate dirty rows
       dirty_batch = paginate(#:select     => "*",
                           :order      => "id",
                           :per_page   => DIRTY_GET_BATCH_SIZE,
                           :conditions => {:dirty => 1},
                           :page       => page)
       if dirty_batch.empty?
         Rails.cache.write("have_dirty_rows",false)
         break
       end
       ...
       page = page.next
     end
   end
除非我添加一些睡眠0.0001之类的东西,否则循环仍然会消耗100%的CPU。Ruby/Rails中是否有一种有效的机制,它会阻止memcached值之类的内容,或者我们可以从memcached值中获取数据,因此它不会一直轮询?

主动轮询是不好的! 脏东西从哪里来?
如果此进程使用消息队列机制(如RabbitMQ)通知其他进程,则会更好。数据库中的某些内容已更改。

对此表示怀疑。轮询很麻烦,但对于连接许多不同类型的进程来说效果很好。唯一的另一种方法是我能想到的cronjob。在这个解决方案杀死服务器之前,检查一下这个问题,也就是说,脏行从哪里来?当您知道正在设置脏位时,您真的不能在代码中执行一些操作吗?事实上,我想知道等待通常是如何实现的,例如对于AMQP客户机。在很多情况下,您无法控制要更改的值的来源……关于阻止Ruby进程的能力的问题。RabbitMQ确实是一个考虑因素,但阻塞本身很有趣……嗯,也许这会帮助您: