2012-09-08 8 views
6

मैं एक छोटा सीनात्रा ऐप बना रहा हूं। यह दो रेडिस कॉल करता है, डेटा देता है, और फिर "आंकड़े" को बचाने के लिए अंतिम रेडिस कॉल करता है।प्रतिक्रिया कैसे भेजें लेकिन सिनात्रा में निष्पादन जारी रखें?

अब तक अगर मैं (इनपुट के आधार पर) जल्दी अनुरोध को समाप्त करना चाहते, मैंने पाया कि मैं halt उपयोग कर सकते हैं:

# code code 
halt send_blank if is_blocked? SETTINGS, host 
# code code 

बहुत अंत में मैं कुछ इस तरह करना चाहते हैं:

response.body = JSON.generate(outgoing) 
# update user 
STATISTICS.hset('u:' + userID, 'data', JSON.generate({'ip' => request.ip, 'time' => Time.now.to_f.to_s})) 

क्या प्रतिक्रिया भेजना संभव है और फिर 5 ~ एमएस रेडिस लिखना संभव है, ताकि ग्राहक को इंतजार न करना पड़े? इससे कोई फर्क नहीं पड़ता कि मैं अंतिम आंकड़े रेडिस कॉल कहां या कैसे रखता हूं, यह कुछ एमएस द्वारा प्रतिक्रिया भेजने में देरी करता है - सिनात्रा की चाल नहीं कर सकता।

यह आसानी से नोड में पूरा किया जा सकता है लेकिन केवल वही लिख रहा है जो मैं चाहता हूं और प्रतिक्रिया भेजने के बाद इसे बंद कर दिया जाएगा; जहां तक ​​मैं समझता हूं, यहां कोड एक प्रतिक्रिया वापस शूटिंग से पहले लगभग 5ms के लिए निष्पादन को अवरुद्ध कर देगा।

मैंने बाद में उपयोग करने का प्रयास किया है .. फ़िल्टर करें, और वे ठीक काम करेंगे, सिवाय इसके कि आप प्रतिक्रिया में डेटा के अलावा उन्हें कुछ भी नहीं पारित कर सकते हैं। मतलब - जिसका अर्थ है कि आप उस फ़िल्टर को पास नहीं कर सकते हैं जो ' आउटपुट होने जा रहा है! पोस्ट ("/") के दायरे से बाहर परिवर्तनीय को असाइन करके इस समस्या से बचना संभव है, हालांकि प्रति सेकंड 100+ अनुरोधों के साथ, मुझे उम्मीद है कि आप देख सकते हैं कि "ग्लोबल्स" के माध्यम से डेटा कैसे स्वैपिंग एक बड़ी समस्या बन सकता है ।

ऐसा कुछ वास्तव में सरल लगता है लेकिन मुझे बाद में कुछ भी बेहतर नहीं मिल रहा है .. दस्तावेज़ों में फ़िल्टर करें।

क्या मैं redis.hset() प्रक्रिया को गैर-अवरुद्ध करने के लिए कोई धागा या कुछ बना सकता हूं, क्या यह काम करेगा? ऐसा लगता है कि यह कट्टर हैकिंग है।

धन्यवाद!

उत्तर

2

रेडिस लेखन को फोर्किंग करना चाहिए।

कुछ इस तरह:

response.body = JSON.generate(outgoing) 
fork do 
    # update user 
    redis = Redis.new(:host => "your_host_name", :port => your_port_number) 
    redis.hset('u:' + userID, 'data', JSON.generate({'ip' => request.ip, 'time' => Time.now.to_f.to_s})) 
end 
+0

forking Heroku पर सिनात्रा में बाहर बग लगता है: *** glibc का पता चला *** माणिक: डबल मुक्त या भ्रष्टाचार (पिछला!): 0x0000000003824b20 *** ऐप्लिकेशन [ वेब .1]: ======= बैकट्रैक: ========= ऐप [वेब.1]: /lib/libc.so.6(+0x775b6)[0x7fef9d8385b6] ऐप [वेब .1]: /lib/libc.so.6(cfree+0x73)[0x7fef9d83ee83] –

+0

क्या आपने कांटा के बजाय थ्रेड.न्यू के साथ प्रयास किया है? –

+0

मूल धागा एमआरआई, केवल जेआरबी और रूबिनीस पर उपलब्ध नहीं है। क्या मैं रूबिनीस की सिफारिश कर सकता हूं? –

संबंधित मुद्दे