2016-08-23 5 views
1

Я кодирую сервер кеша в 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

Это создаст сумасшедшее количество потоков за очень короткое время, если это будет загружено. То, что вам действительно нужно, - это очередь приоритетов, в которой элементы сортируются по времени истечения срока действия и периодическому таймеру, который проверяет, истек ли первый элемент, обрабатывает его и повторяет это, пока не осталось ничего до истечения срока действия, а затем ненадолго вернется спать.

Существует несколько рубиновых камней, которые реализуют такие вещи, любой, кто выполняет адекватно, сделает, или вы можете написать свой собственный, это не слишком сложно, используя bsearch_index, чтобы быстро найти точку вставки.

Думаю, вы найдете одну очередь с одним потоком, которая будет работать намного лучше, чем потенциально тысячи потоков. Каждый поток несет довольно значительное количество накладных расходов, поэтому лучше всего их свести к минимуму.

+0

Еще раз спасибо, да, это выглядело неправильно, но это был единственный способ удалить ключи в точное время. Но что на несколько секунд больше, чем при отсутствии сто потоков. –

+1

Это вряд ли будет отставать больше, чем несколько миллисекунд, если вы сделаете это правильно. – tadman

Смежные вопросы