Что может привести к зависанию Ruby при выходе?

StackOverflow https://stackoverflow.com/questions/2436754

  •  19-09-2019
  •  | 
  •  

Вопрос

У меня есть сценарий Ruby, который выполняет несколько операций принудительного выполнения (через API сценариев), а затем просто завершается:

def foo()
  ...
end

def bar()
  ...
end

foo()
bar()
puts __LINE__
exit 0
#end of file

...и пока ЛИНИЯ будет распечатан, процесс никогда не закончится, независимо от того, есть выход (0) или нет.Это Ruby 1.8.6, в основном на Mac, но я вижу это и на ПК.

Я обычно ковыряюсь в Google, но надеялся, что здесь может быть голос опыта, на который можно положиться.Спасибо.

Это было полезно?

Решение

Я совсем не знаком с перфорсом, но виновником может быть at_exit метод, который по какой-то причине застрял в цикле.Наблюдайте за поведением, используя irb, например:

$ irb
irb(main):001:0> require 'time'
=> true
irb(main):002:0> at_exit { puts Time.now; sleep 10; puts Time.now }
=> #<Proc:0xb7656f64@(irb):2>
irb(main):003:0> exit
Fri Mar 12 19:46:25 -0500 2010
Fri Mar 12 19:46:35 -0500 2010

Чтобы подтвердить, at_exit функция вызывает зависание процесса, вы можете попробовать подключиться к at_exit.Обратите внимание, что #{caller} отобразит трассировку стека того, кто звонил at_exit:

def at_exit &block
    @at_exit_counter ||= 0
    puts "at_exit #{@at_exit_counter} called"
    s = "Calling at_exit ##{@at_exit_counter} from #{caller}"
    super { puts s; block.call() }
    @at_exit_counter += 1
end

at_exit { puts "I'll never return"; sleep 1 while true; }
at_exit { puts 'I am about to leave.' }

def do_cleanup
    puts "Cleaning..."
    at_exit { puts 'Cleaning up before exit...' }

end

do_cleanup

который выводит:

at_exit 0 called
at_exit 1 called
Cleaning...
at_exit 2 called
Calling at_exit #2 from exitcheck.rb:14:in `do_cleanup'exitcheck.rb:18
Cleaning up before exit...
Calling at_exit #1 from exitcheck.rb:10
I am about to leave.
Calling at_exit #0 from exitcheck.rb:9
I'll never return

и никогда не возвращается.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top