Ruby on rails 我们如何在Memcached读取上阻止rubyonrails,这样它就不会占用CPU?
我们有一个守护进程,它扫描一个表中的脏位,然后将脏行批量调度到延迟的_作业。为了避免从dirty=1的数据中选择常量,我们设置了一个memcached屏障,它包装了表扫描,如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
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确实是一个考虑因素,但阻塞本身很有趣……嗯,也许这会帮助您: