撬中简单操作的线程死锁

时间:2018-07-04 09:00:21

标签: ruby multithreading deadlock pry

[注意:我通过创建和使用新的宝石集来“解决”此问题。我仍然很好奇为什么会发生此问题,但是它不再使我受阻。]

[我知道在Deadlock in Ruby join()存在类似的问题,但是我尝试了在那里建议的timeout参数,但这没有帮助。我怀疑那里没有解决特定于撬的问题。]

我在运行下面的代码时收到以下错误,但仅在撬会话中执行时才出现。这段代码没有被更改,并且已经运行了好一阵子,而且我不知道为什么这只是一个问题。我在Ruby 2.5.1上使用了撬版本0.11.3。此外,将此代码粘贴到撬中时效果很好。它无法在我的wifi-wand应用程序中运行,该应用程序在其对象之一(要安装的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'

1 个答案:

答案 0 :(得分:0)

奇怪的是,此问题已通过卸载并重新安装awesome_print gem得以解决。我不知道为什么。