Допустим, у меня есть 4 папки с 25 папками в каждом. В каждой из этих 25 папок есть 20 папок с 1 очень длинным текстовым документом. Метод, который я использую сейчас, кажется, имеет место для улучшения и в каждом сценарии, в котором я реализую потоки ruby, результат медленнее, чем раньше. У меня есть массив из 54 имен папок. Я перебираю каждый из них и использую метод foreach для получения глубоко вложенных файлов. В цикле foreach я делаю 3 вещи. Я получаю содержимое сегодняшнего файла, я получаю содержимое вчерашнего файла, и я использую свой алгоритм diff, чтобы найти то, что изменилось со вчерашнего дня. Как бы вы делали это быстрее с помощью потоков.Ruby threading vs normal
def backup_differ_loop device_name
device_name.strip!
Dir.foreach("X:/Backups/#{device_name}/#{@today}").each do |backup|
if backup != "." and backup != ".."
@today_filename = "X:/Backups/#{device_name}/#{@today}/#{backup}"
@yesterday_filename = "X:/Backups/#{device_name}/#{@yesterday}/#{backup.gsub(@today, @yesterday)}"
if File.exists?(@yesterday_filename)
today_backup_content = File.open(@today_filename, "r").read
yesterday_backup_content = File.open(@yesterday_filename, "r").read
begin
Diffy::Diff.new(yesterday_backup_content, today_backup_content, :include_plus_and_minus_in_html => true, :context => 1).to_s(:html)
rescue
#do nothing just continue
end
end
else
#file not found
end
end
end
Простая версия потоков будет состоять в том, чтобы использовать пул для обработки каждого файла (или даже каталога/устройства, в зависимости от области видимости) в отдельном потоке в виде отдельного автономного процесса. Пул позволяет избежать небольшого количества накладных расходов, позволяя одному потоку (по одному на время) обрабатывать несколько элементов. Если нет измененных общих данных (т. Е. «Резервная копия» уникальна для каждого процесса потока), то нет проблем с параллелизмом, о которых нужно беспокоиться (кроме запуска).Кроме того, версия Ruby имеет значение, если это может даже быть полезным изменением. Теперь прочитайте и спроектируйте реализацию. Вернитесь с проблемой :) – user2864740