우선 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
# 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 대신 사용할 수있는 대안이 있습니까?
어떤 도움 당신은 여기에 모든 예외를 잡는하지 않을
, 이유 스레드를 사용하지 않고 스레드 오류가 발생하면 루비 시간 초과 라이브러리가 net/http (open-uri에서 차례대로 사용됨)에 사용되고 스레드 시간 초과는 스레드를 사용합니다. –
그래, 그만큼 많이 짐작했지만 여전히 해결 방법을 모릅니다. 문제 :/ –
[curb] (https://github.com/taf2/curb)는 원시 Net :: HTTP보다 훨씬 더 즐겁습니다. – tadman