मैं रैक में समवर्ती अनुरोध हैंडलिंग के विकल्पों को पूरी तरह से समझने का प्रयास कर रहा हूं। मैंने एक लंबे मतदान वाले ऐप बनाने के लिए async_sinatra का उपयोग किया है, और अब throw :async
और/या पतला - थ्रेड वाला ध्वज का उपयोग करके नंगे धातु रैक के साथ प्रयोग कर रहा हूं। मैं इस विषय के साथ सहज हूं, लेकिन कुछ चीजें हैं जिन्हें मैं समझ नहीं पा रहा हूं। (नहीं, मैं समांतरता के लिए समवर्तीता को गलत नहीं समझ रहा हूं, और हां, मैं जीआईएल द्वारा लगाई गई सीमाओं को समझता हूं)।रैक समवर्ती - rack.multithread, async.callback, या दोनों?
क्यू 1। मेरे परीक्षण इंगित करते हैं कि thin --threaded
(यानी rack.multithread=true
) अलग-अलग धागे (मैं ईएम का उपयोग करना मानता हूं) में समवर्ती रूप से अनुरोध करता हूं, जिसका अर्थ है लंबे समय से चलने वाला अनुरोध ए अनुरोध बी (आईओ को अलग) को अवरुद्ध नहीं करेगा। इसका मतलब है कि मेरे आवेदन को समेकन प्राप्त करने के लिए किसी भी विशेष कोडिंग (उदा। कॉलबैक) की आवश्यकता नहीं है (फिर, ब्लॉकिंग डीबी कॉल, आईओ इत्यादि को अनदेखा करना)। यही मेरा मानना है कि मैंने देखा है - क्या यह सही है?
प्रश्न 2। EventMachine.defer
और throw :async
समेत समवर्तीता प्राप्त करने के एक और अधिक चर्चा किए गए माध्यम हैं। कड़ाई से बोलते हुए, अनुरोध धागे का उपयोग करके संभाले गए हैं। उन्हें क्रमशः निपटाया जाता है, लेकिन इन्हें भारी उठाने और इवेंटमैचिन को कॉलबैक बंद कर दिया जाता है, जो बाद में प्रतिक्रिया भेजने के लिए async.callback का उपयोग करता है। अनुरोध के बाद ए ने अपना काम EM.defer पर ऑफ़लोड कर दिया है, अनुरोध बी शुरू हो गया है। क्या यह सही है?
क्यू 3। उपर्युक्त मानना अधिक या कम सही है, क्या दूसरे पर एक विधि के लिए कोई विशेष लाभ है? जाहिर है --threaded
एक जादू बुलेट की तरह दिखता है। क्या कोई डाउनसाइड्स हैं? यदि नहीं, तो हर कोई async_sinatra
/throw :async
/async.callback
के बारे में क्यों बात कर रहा है? शायद पूर्व "मैं अपने रेल ऐप को भारी भार के तहत थोड़ा सा स्नैपियर बनाना चाहता हूं" और बाद वाले कई लंबे समय से चल रहे अनुरोधों वाले ऐप्स के लिए बेहतर अनुकूल है? या शायद पैमाने एक कारक है? बस अनुमान लगाओ।
मैं एमआरआई रूबी 1.9.2 पर पतला 1.2.11 चला रहा हूं। (FYI करें, मैं --no-epoll
झंडा उपयोग करने के लिए, के रूप में वहाँ epoll और रूबी 1.9.2 के EventMachine के उपयोग के साथ a long-standing, supposedly-resolved-but-not-really problem है है कि बिंदु के पास है, लेकिन किसी भी अंतर्दृष्टि का स्वागत है।।)
एपोल समस्या को ठीक किया जाना चाहिए क्योंकि यह उस टिकट में कहता है, यह [प्रतिबद्धता] है (https://github.com/eventmachine/eventmachine/commit/d684cc3b77a6c401295a3086b5671fe4ec335a64) वे इंगित कर रहे हैं। – Bitterzoet
यदि मैं --no-epoll ध्वज को हटाता हूं तो मेरे थ्रेडेड अनुरोध मिलीसेकंड से मिनट तक जाते हैं। ईएम 0.12.10, रुबी 1.9.2-पी 180। मुझे लगता है कि मैं पी 2 9 0 संकलित करने की कोशिश कर सकता हूं ... – bioneuralnet
अच्छा सवाल। मैंने यहां एक बहुत ही समान प्रश्न पूछा है: http://stackoverflow.com/questions/8146851/how-to-deploy-a-threadsafe-asynchronous-rails-app और यहां कुछ प्रयोग किया है: https: // github। कॉम/जेजेबी/थ्रेडेड-रेल-उदाहरण (ध्यान दें कि थ्रेडेड पतले सफलतापूर्वक असीमित है, यह बेंचमार्क धीमा है) –