用于FTP的Ruby Threads(Rake)

时间:2009-09-11 21:58:35

标签: ruby multithreading ftp rake

我有一个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 个答案:

答案 0 :(得分:2)

如果abort_on_exception为false且未启用调试标志(默认),则未处理的异常会终止当前线程。在你提出它的线程上发出连接之前,你甚至都不知道它。因此,您可以进行连接或更改调试标志,如果确实抛出了异常,则应该获得异常。

答案 1 :(得分:0)

问题的根源是通过添加:

来解决的
threads.each { |t| t.join }
file_slice循环结束后

感谢JRL帮助我找到了例外!