Ruby: open verursacht einen Deadlock


Zunaechst bin ich ein Anfänger in Ruby und nicht sehr vertraut mit der Art und Weise, wie Ruby den Code verwaltet und zum Laufen bringt. Daher erwarte ich, dass ich nicht weiss, wie man Ruby richtig benutzt.
Das Problem, das ich habe, ist ein Deadlock, aber ich verwende keine Threads in meinem Programm. Außerdem tritt der Fehler nur etwa alle 1000 bis 1500 Funktionsaufrufe auf, was es sehr schwierig macht, ihn genau zu lokalisieren und zu korrigieren.
Hier ist die vollständige Fehlermeldung, wenn das Problem auftritt:

/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>'

Der Link zum kompletten Programm ist hier:https: //github.com/Hellfire01/MangaScra
Das Problem tritt bei den drei verschiedenen Methoden auf, die open verwenden. Diesmal ist die hier abgestürzt:

# conect to link and download picture
def get_pic(link)
  safe_link = link.gsub(/[\[\]]/) { '%%%s' % 
# 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
amp;.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

Hier ist der Link der Datei:https: //github.com/Hellfire01/MangaScrap/blob/master/sources/utils.r

Was ich gerne wissen würde:
- Wie kann ich diesen Fehler beheben?
- Wenn ich diesen Fehler nicht beheben kann, gibt es Alternativen zu open-uri, die ich verwenden kann?

Jede Hilfe ist herzlich willkommen

Antworten auf die Frage(2)

Ihre Antwort auf die Frage