我们如何在Memcached读取上阻止Ruby on Rails,以免它占用CPU?

我们有一个守护进程,它扫描表中的脏位,然后批量调度脏行到delayed_job。 为了避免select from data where dirty = 1进行常量select from data where 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 

除非我添加一些sleep 0.0001等,否则循环仍然会占用100%的CPU。 Ruby / Rails中是否存在一种有效的机制,它会阻塞memcached值,或者我们可以从memcached值中提取,所以它不是一直在轮询?

积极的民意调查很糟糕! 脏位来自哪里? 如果此进程使用消息队列机制(例如RabbitMQ)来通知其他进程,那么它会更好。 数据库中发生了一些变化。