安排任务的正确方法

时间:2016-08-23 22:18:11

标签: ruby multithreading thread-safety

我在Ruby中编写缓存服务器,我需要为存储的数据设置过期时间。因此,当用户将数据存储在密钥foo下时,他也会以秒为单位设置到期时间。那时需要删除数据,所以我对这个调度的想法是创建一个线程并让它进入睡眠状态,直到那个时间到来。

Thread.new(@options[:exp_time], key) do |t, k|
    exp = Time.now + t
    sleep(t)
    if @data.key?(k) && @data[k][:exp_time] <= exp #check if it hasn't been updated
        @data.delete(k)
    end
end

t是用户发送的时间,密钥是存储数据的密钥。如果用户替换存储在密钥中的数据,也可以更改到期时间,以便我检查它。我想知道这是否是一个很好的线程使用,或者它是否消耗了太多的资源,或者这是一种更简单的方法。我不能使用任何类型的宝石或库。在此先感谢您的任何帮助

1 个答案:

答案 0 :(得分:1)

如果加载负载,那将在很短的时间内创建一个疯狂的线程数。您真正想要的是一个优先级队列,其中元素按到期时间排序,周期性计时器检查第一个条目是否过期,处理它,并重复该过程,直到没有任何东西过期,然后重新进入休眠状态。 / p>

有一些Ruby宝石可以实现这类功能,任何一个可以执行此类功能的东西,或者你可以编写自己的宝石,使用bsearch_index快速找到插入点并不太难。

我认为你会发现一个队列中有一个线程比可能有数千个线程更好。每个线程都承担相当大的开销,因此最好将这些开销保持在最低限度。