मैं कई एमवीआर का उपयोग करते समय किसी समस्या को डीबग करने का प्रयास कर रहा हूं, हालांकि कोई किस्मत नहीं।थ्रेड किसी एमवीआर ऑपरेशन में अनिश्चित काल तक अवरुद्ध
मेरा कोड दो एमवीआर का उपयोग करता है: एक सर्वर वर्तमान स्थिति को स्टोर करने के लिए, और दूसरा क्लाइंट थ्रेड से नेटवर्क ईवेंट को पास करने के लिए। हालांकि कई बार कनेक्ट करने और डिस्कनेक्ट करने के बाद, सर्वर नए क्लाइंट कनेक्ट करने पर डेटा भेजना बंद कर देता है (संभवतः क्योंकि नेटवर्क इवेंट्स एमवीआर किसी भी कारण से खाली हो जाता है) और अंततः त्रुटि के साथ भ्रमण करता है: *** Exception: thread blocked indefinitely in an MVar operation
मैंने कोशिश करने में निम्नलिखित निष्कर्ष निकाला है पिछले कुछ दिनों में इस मुद्दे को डिबग करने के लिए:
- MVAr (रों) संशोधित करने के लिए इस्तेमाल किया कार्यों अभ्यस्त अपवाद
- फेंक समस्या एक ग्राहक जब तक या तो जोड़ता है, या तो डिस्कनेक्ट जोड़ता
- नहीं होती है ऐसा लगता है कि यह मुद्दा चलाया गया है domly (कभी कभी कई ग्राहकों तो डिस्कनेक्ट कनेक्ट कर सकते हैं, दूसरी बार इसे तुरंत होता है)
मैं तीन फाइलों को समस्या अलग-थलग कर दिया है:
- https://github.com/Mattiemus/IMC-Server/blob/master/IMC.hs (अपवाद
sense
में फेंक दिया जाता है) - https://github.com/Mattiemus/IMC-Server/blob/master/IMC/Networking/Server.hs
- https://github.com/Mattiemus/IMC-Server/blob/master/IMC/Utilities/Concurrency.hs (कार्य करता है जो धक्का और एक MVAr में जमा एक सूची में पॉप) 012 (
application
handleClient
, और
cleanupClient
भीतर Modifined)
मैं पूरी तरह विचारों से बाहर हूँ, के रूप में मैं केवल का उपयोग modifyMVar और withMVar (ताकि निश्चित रूप से यह पूरी तरह से खाली कभी नहीं छोड़ा जाना चाहिए) - मेरे केवल धारणा है कि हो सकता है एक अपवाद MVAr को संशोधित करते हुए फेंक दिया जा रहा है, फिर भी मुझे लगता है कि यह बेहद असंभव है।
किसी भी मदद की सराहना की जाती है, यह समस्या मुझे कुछ समय के लिए परेशान कर रही है।
मुझे नहीं लगता कि ज्यादातर लोगों को इस बग को खोजने के लिए इतना कोड के माध्यम से खोज करने के लिए चाहते हैं। शायद कुछ परीक्षण लिखने से आपको यह ढूंढने में मदद मिलेगी। – user2407038
मैंने 4 मुख्य कार्यों में समस्या को और पिन करने के लिए प्रश्न को संशोधित किया है। इस समस्या को अलग करने के लिए मुझे किस प्रकार के परीक्षण लिखने की आवश्यकता होगी, समस्या अंततः मौसम के बावजूद होती है, मैं सर्वर या घटनाओं एमवीआर पर सभी संशोधकों को हटा देता हूं, जिससे मुझे विश्वास होता है कि मैं उन्हें गलत तरीके से उपयोग कर रहा हूं। घटनाओं पर कई उत्पादक हैं एमवीआर (प्रत्येक ग्राहक के लिए एक धागा) हालांकि केवल एक उपभोक्ता - शायद यह मुद्दा है? – Mattiemus
'समझ' में आप एक चैनल की तरह 'MVar' का उपयोग कर रहे हैं। इसके बजाए 'चैन' का उपयोग क्यों न करें? –