2010-03-13 3 views
0

У меня есть сценарий рубин, который делает несколько неволей операций (через скриптовый API), а затем просто заканчивается:Что может привести к блокировке рубина во время выхода?

def foo() 
    ... 
end 

def bar() 
    ... 
end 

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

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

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

ответ

1

Я не совсем знаком с perforce, но виновником может быть метод 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:[email protected](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 

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

Смежные вопросы