2016-06-17 4 views
0


우선 Ruby의 초보자이며 Ruby가 코드를 관리하고 작동하도록하는 방식에 익숙하지 않아 사용법을 알지 못하는 문제가 발생할 것으로 예상됩니다. 루비 제대로.
내가 겪고있는 문제는 교착 상태이지만 내 프로그램에 스레드를 사용하고 있지 않습니다. 또한 오류는 1000-1500 건의 함수 호출마다 한 번 발생하기 때문에 정확히 찾아 내고 수정하기가 어렵습니다.
Ruby : 오픈으로 교착 상태가 발생합니다.

/usr/lib/ruby/2.3.0/timeout.rb:95:in `join': No live threads left. Deadlock? (fatal) 
    from /usr/lib/ruby/2.3.0/timeout.rb:95:in `ensure in block in timeout' 
    from /usr/lib/ruby/2.3.0/timeout.rb:95:in `block in timeout' 
    from /usr/lib/ruby/2.3.0/timeout.rb:101:in `timeout' 
    from /usr/lib/ruby/2.3.0/net/http.rb:878:in `connect' 
    from /usr/lib/ruby/2.3.0/net/http.rb:863:in `do_start' 
    from /usr/lib/ruby/2.3.0/net/http.rb:852:in `start' 
    from /usr/lib/ruby/2.3.0/open-uri.rb:319:in `open_http' 
    from /usr/lib/ruby/2.3.0/open-uri.rb:737:in `buffer_open' 
    from /usr/lib/ruby/2.3.0/open-uri.rb:212:in `block in open_loop' 
    from /usr/lib/ruby/2.3.0/open-uri.rb:210:in `catch' 
    from /usr/lib/ruby/2.3.0/open-uri.rb:210:in `open_loop' 
    from /usr/lib/ruby/2.3.0/open-uri.rb:151:in `open_uri' 
    from /usr/lib/ruby/2.3.0/open-uri.rb:717:in `open' 
    from /usr/lib/ruby/2.3.0/open-uri.rb:35:in `open' 
    from /home/mat/travail_perso/RUBY/MangaScrapp_github/sources/utils.rb:85:in `get_pic' 
    from /home/mat/travail_perso/RUBY/MangaScrapp_github/mangafox/MF_download.rb:87:in `page_link' 
    from /home/mat/travail_perso/RUBY/MangaScrapp_github/mangafox/MF_download.rb:116:in `chapter_link' 
    from /home/mat/travail_perso/RUBY/MangaScrapp_github/mangafox/MF_download.rb:142:in `chapter' 
    from /home/mat/travail_perso/RUBY/MangaScrapp_github/mangafox/MF_update.rb:57:in `block in MF_manga_missing_chapters' 
    from /home/mat/travail_perso/RUBY/MangaScrapp_github/mangafox/MF_update.rb:45:in `reverse_each' 
    from /home/mat/travail_perso/RUBY/MangaScrapp_github/mangafox/MF_update.rb:45:in `MF_manga_missing_chapters' 
    from /home/mat/travail_perso/RUBY/MangaScrapp_github/mangafox/MF_update.rb:80:in `MF_update' 
    from /home/mat/travail_perso/RUBY/MangaScrapp_github/sources/update.rb:5:in `update_manga' 
    from /home/mat/travail_perso/RUBY/MangaScrapp_github/sources/update.rb:15:in `block in update_all' 
    from /home/mat/travail_perso/RUBY/MangaScrapp_github/sources/update.rb:14:in `each' 
    from /home/mat/travail_perso/RUBY/MangaScrapp_github/sources/update.rb:14:in `update_all' 
    from /home/mat/travail_perso/RUBY/MangaScrapp_github/sources/update.rb:22:in `update' 
    from ./MangaScrap.rb:28:in `<main>' 

전체 프로그램에 대한 링크가 여기에 있습니다 : : 문제가 발생했을 때
다음 가 전체 오류 메시지입니다 문제가 열려 사용하는 3 가지 방법은 어떻게됩니까 https://github.com/Hellfire01/MangaScrap
, 여기에 하나입니다 https://github.com/Hellfire01/MangaScrap/blob/master/sources/utils.rb

,536,913 : 여기

# conect to link and download picture 
def get_pic(link) 
    safe_link = link.gsub(/[\[\]]/) { '%%%s' % $&.ord.to_s(16) } 
    tries ||= 20 
    begin 
    page = open(safe_link, "User-Agent" => "Ruby/#{RUBY_VERSION}") 
    rescue URI::InvalidURIError => error 
    puts "Warning : bad url" 
    puts link 
    puts "message is : " + error.message 
    return nil 
    rescue => error 
    if tries > 0 
    tries -= 1 
    sleep(0.2) 
    retry 
    else 
     puts 'could not get picture ' + safe_link + ' after ' + $nb_tries.to_s + ' tries' 
     puts "message is : " + error.message 
     return nil 
    end 
    end 
    sleep(0.2) 
    return page 
end 


파일의 링크입니다 :이 시간을 추락

내가 알고 싶은 점 :
- 어떻게이 오류를 해결할 수 있습니까?
-이 오류를 해결할 수 없다면 사용할 수있는 open-uri 대신 사용할 수있는 대안이 있습니까?

어떤 도움 당신은 여기에 모든 예외를 잡는하지 않을

+1

, 이유 스레드를 사용하지 않고 스레드 오류가 발생하면 루비 시간 초과 라이브러리가 net/http (open-uri에서 차례대로 사용됨)에 사용되고 스레드 시간 초과는 스레드를 사용합니다. –

+1

그래, 그만큼 많이 짐작했지만 여전히 해결 방법을 모릅니다. 문제 :/ –

+1

[curb] (https://github.com/taf2/curb)는 원시 Net :: HTTP보다 훨씬 더 즐겁습니다. – tadman

답변

2

을 가장 환영합니다. rescue 뒤에 아무 것도 지정되지 않으면 예외 클래스의 루트에 있지 않은 StandardError을 잡는 중임을 의미합니다. 당신은 당신이 모든 예외를 잡기하고 있는지 확인하고, URL을 여는 (또는 원하는대로 행동) 다시 시도하려면

, 싶은 것은 : 참고로 rescue Exception => error

관련 문제