Вопрос

У меня есть задача rake, которая загружает список файлов через ftp. Копирование без многопоточности работает нормально, но было бы быстрее, если бы я мог сделать несколько одновременных загрузок. (Я новичок в рубине и многопоточности, поэтому неудивительно, что это не сработало сразу.)

У меня есть:

files.each_slice(files.length / max_threads) do |file_set|
    threads << Thread.new(file_set) do |file_slice|
        running_threads += 1
        thread_num = running_threads
        thread_num.freeze
        puts "making thread # #{thread_num}"

        file_slice.each do |file|
            file.freeze
            if File.directory?(file) 
            else
                puts file.pathmap("#{$ftpDestination}%p")
                ftp.putbinaryfile(file, file.pathmap("#{$ftpDestination}%p")) 
            end
        end
    end    
end

Мой вывод:

making thread # 1
/test/./1column-ff-template.aspx
making thread # 2
making thread # 3
/test/./admin/footerContent.aspx
/test/./admin/contentList.aspx
making thread # 4
/test/./3columnTemplate.ascx
making thread # 5
/test/./ascx/dashboard/dash.ascx
making thread # 6
/test/./ascx/Links.ascx
making thread # 7
/test/./bin/App_GlobalResources.dll
making thread # 8
/test/./bin/App_Web__foxtqrr.dll
making thread # 9
/test/./GetPageLink.ascx

Похоже, что каждый поток начинает загружать файл, а затем умирает без ошибки. Что я делаю не так?

Это было полезно?

Решение 2

Корень проблемы был исправлен добавлением:

threads.each { |t| t.join }

после завершения цикла file_slice .

Спасибо JRL за помощь в поиске исключения!

Другие советы

Если abort_on_exception имеет значение false и флаг отладки не включен (по умолчанию), необработанное исключение убивает текущий поток. Вы даже не узнаете об этом, пока не создадите соединение в потоке, который его поднял. Таким образом, вы можете сделать соединение или изменить флаг отладки, и вы должны получить исключение, если оно действительно выброшено.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top