سؤال

ولدي مهمة أشعل النار التي بتحميل قائمة من الملفات عن طريق بروتوكول نقل الملفات. النسخ دون خيوط يعمل بشكل جيد، ولكن سيكون أسرع إذا كان بإمكاني القيام متعددة تحميل المتزامنة. (أنا جديدة على روبي وخاصية تعدد، لذلك ليس من المستغرب أنه لم يعمل الحق قبالة الخفافيش).

ولدي:

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 هو زائف ولم يتم تمكين العلم التصحيح (الافتراضي) استثناء غير معالج يقتل الترابط الحالي. أنت لا تعرف حتى عن ذلك حتى يتم إصدار الانضمام على الخيط الذي رفعه. حتى تتمكن من القيام صلة أو تغيير العلم التصحيح ويجب عليك الحصول على استثناء إذا تم طرح واحد في الواقع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top