[Примечание: я «исправил» эту проблему, создав и используя новый набор гемов. Мне все еще интересно, почему возникла проблема, но она больше не блокирует меня.]
[Я знаю, что есть похожая проблема в Deadlock в Ruby join () , но я попробовал предложенный там параметр времени ожидания, и он не помогает. Я подозреваю, что там есть проблема, специфичная для pry.]
При выполнении приведенного ниже кода я получаю сообщение об ошибке ниже, но только при выполнении в сеансе pry. Этот код не был изменен и долгое время работал нормально, и я понятия не имею, почему это проблема сейчас. Я использую pry версии 0.11.3 на Ruby 2.5.1. Кроме того, этот код отлично работает при вставке в pry; он не работает в моем приложении wifi-wand, которое запускает pry в контексте одного из своих объектов (gem install wifi-wand
для установки, https://github.com/keithrbennett/wifiwand - это страница проекта).
domains = %w(google.com baidu.com)
puts "Calling dig on domains #{domains}..." if @verbose_mode
threads = domains.map do |domain|
Thread.new do
output = `dig +short #{domain}`
output.length > 0
end
end
threads.each(&:join)
[1] pry(#<WifiWand::CommandLineInterface>)> ci
Calling dig on domains ["google.com", "baidu.com"]...
fatal: No live threads left. Deadlock?
3 threads, 3 sleeps current:0x00007fbd13d0c5a0 main thread:0x00007fbd13d0c5a0
* #<Thread:0x00007fbd14069c20 sleep_forever>
rb_thread_t:0x00007fbd13d0c5a0 native:0x00007fff89c2b380 int:0
/Users/kbennett/work/wifi-wand/lib/wifi-wand/models/base_model.rb:89:in `join'
/Users/kbennett/work/wifi-wand/lib/wifi-wand/models/base_model.rb:89:in `each'
/Users/kbennett/work/wifi-wand/lib/wifi-wand/models/base_model.rb:89:in `block in connected_to_internet?'
/Users/kbennett/work/wifi-wand/lib/wifi-wand/models/base_model.rb:126:in `connected_to_internet?'
/Users/kbennett/work/wifi-wand/lib/wifi-wand/command_line_interface.rb:264:in `cmd_ci'