मेरा अनुमान है कि या तो कुछ EventMachine रिएक्टर पाश बांधने ऊपर है यह बाहर निकलने से रोक रहा है, या कुछ और SIGINT फँसाने रहा है।
पूर्व का एक सरल उदाहरण के रूप में, config.ru
में डाल और thin -p 4567 start
साथ चलाएँ:
require 'thin'
require 'sinatra'
require 'eventmachine'
get '/' do
"hello world"
end
run Sinatra::Application
EventMachine.schedule do
trap("INT") do
puts "Caught SIGINT"
EventMachine.stop # this is useless
# exit # this stops the EventMachine
end
i = 0
while i < 10
puts "EM Running"
i += 1
sleep 1
end
end
SIGINT फँसाने के बिना, आप जब यह फँसाने और EM.stop कॉल करने जैसा ही व्यवहार मिलता है। EM.stop (कम से कम शुद्ध रूबी संस्करण में, जिसे आप EVENTMACHINE_LIBRARY="pure_ruby" thin start
के साथ चला सकते हैं) एक ध्वज सेट करता है कि एक स्टॉप अनुरोध किया गया है, जिसे रिएक्टर लूप के अंदर उठाया जाता है। यदि रिएक्टर लूप एक चरण (जैसे उपर्युक्त मामले में) पर फंस गया है, तो यह बाहर नहीं निकलेगा।
तो कुछ विकल्प:
SIGINT फँसाने और एक निकास के लिए मजबूर कर के ऊपर तरीके का उपयोग। यह एक अशुद्ध राज्य में कनेक्शन छोड़ सकता है, लेकिन वे यह कॉल नहीं करते त्वरित & गंदा कुछ नहीं के लिए;)
आप एक धागा या एक फाइबर, जो रिएक्टर रखने के लिए अनुमति देगा अंदर अवरुद्ध कोड डाल सकता है चल रहा है।
अपने कोड के अंदर लंबे समय तक चलने वाले कार्यों या लूप की तलाश करें, और इन्हें EventMachine को अवगत कराएं। em-http-request बाहरी http अनुरोधों के लिए एक महान लाइब्रेरी है, और एम-सिंक्रनाइज़ में कई अन्य प्रोटोकॉल हैं (डेटाबेस कनेक्शन, टीसीपी कनेक्शन पूल, आदि के लिए)। उपरोक्त उदाहरण में, यह स्पष्ट है: EventMachine.add_periodic_timer(1) { puts "EM Running" }
अपने वास्तविक कोड में, यह पता लगाने, लेकिन किसी भी स्थानों पर जहां आप धागे अंडे और उन्हें शामिल होने, या बड़े छोरों देखने के लिए कठिन हो सकता है। एक प्रोफाइलिंग टूल यह दिखाने में सहायता कर सकता है कि जब आप बाहर निकलने का प्रयास करते हैं तो कौन सा कोड चल रहा है, और आखिरकार आप सिस्टम और पुस्तकालयों के विभिन्न हिस्सों को अक्षम करने का प्रयास कर सकते हैं ताकि यह पता चल सके कि अपराधी कहां है।
स्रोत
2011-07-20 08:49:40
क्या आप अपनी पतली और टोपी कॉन्फ़िगरेशन फाइलें प्रदान कर सकते हैं? – Anatoly
'ctrl + z' और फिर' एंटर 'आज़माएं? – Zabba
आप छोटे ज्ञात Ctrl- \ को भी आजमा सकते हैं जो कभी-कभी अद्भुत काम करता है। –