ما قد يتسبب في حبس الروبي أثناء الخروج؟
سؤال
لدي برنامج نصي Ruby الذي يقوم ببعض عمليات Perforce (من خلال برامج البرمجة النصية)، ثم ينتهي ببساطة:
def foo()
...
end
def bar()
...
end
foo()
bar()
puts __LINE__
exit 0
#end of file
... وبينما خط سوف تطبع، العملية لا تنتهي أبدا، سواء كان الخروج (0) موجودا أم لا. هذا روبي 1.8.6، في المقام الأول على جهاز Mac، لكنني أرى هذا على جهاز الكمبيوتر أيضا.
أقوم بعمل Google المعتادة، لكنه يأمل أن يكون هناك صوت خبرة هنا للبنك. شكرا.
المحلول
أنا لست على الإطلاق على الإطلاق مع 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: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 يسمى at_exit 1 يسمى التنظيف ... AT_EXIT 2 يسمى Calling At_Exit # 2 من Exitcheck.rb: 14: in `do_cleanup'Exitcheck.rb: 18 التنظيف قبل الخروج ... الاتصال AT_EXIT # 1 من Exitcheck.rb: 10 أنا على وشك مغادرة. استدعاء at_exit # 0 من exitcheck.rb: 9 لن أعود أبدا
ولا تعود أبدا.
لا تنتمي إلى StackOverflow