एक पोर्ट को सिंक्रोनाइज़ करते समय पढ़ना / लिखना क्या है?


108

Rebol 3 में सभी पोर्ट ऑपरेशन अतुल्यकालिक हैं। एकमात्र तरीका जिसे मैं समकालिक संचार कर सकता हूं, वह है कॉलिंग wait

लेकिन इस मामले में कॉलिंग प्रतीक्षा के साथ समस्या यह है कि यह सभी खुले बंदरगाहों के लिए घटनाओं की जांच करेगा (भले ही वे प्रतीक्षा करने के लिए पारित पोर्ट ब्लॉक में नहीं हैं)। फिर वे अपने जवाब देने वाले इवेंट हैंडलर को बुलाते हैं, लेकिन उन इवेंट हैंडलर में से एक में रीड / राइट किया जा सकता है। इसके परिणामस्वरूप "प्रतीक्षा" के लिए पुनरावर्ती कॉल हो सकते हैं।

मैं इसके आसपास कैसे पहुंचू?


8
वास्तव में, मुझे नहीं लगता कि वर्तमान R3 कार्यान्वयन में इसका कोई समाधान है, इसलिए मैं "प्रतीक्षा" के लिए "/" केवल "परिशोधन" जोड़ने के लिए आगे बढ़ा, जिसके साथ, यह केवल "प्रतीक्षा" के लिए प्रदान किए गए बंदरगाहों पर प्रतीक्षा करेगा , और इस प्रकार पुनरावर्ती कॉल से बचें। मेरे अनुरोध को देखें: github.com/rebol/rebol/pull/177
Shixin Zeng

1
जिज्ञासा से बाहर, आपको इसे तुल्यकालिक होने की आवश्यकता क्यों है?
ताडज़्की

1
ऐसी बहुत सी स्थितियाँ हैं जो सिंक्रोनस पोर्ट के साथ कोडिंग करना बहुत आसान है: मान लीजिए कि आप एक बटन पर एक क्लिक के साथ एक ईमेल भेजना चाहते हैं, और रिपोर्ट करें कि क्या यह सफल होता है या विफल। कुछ और करने से पहले इसे खत्म करने के लिए इंतजार करना बहुत आसान है।
शिक्सिन ज़ेंग

1
क्या आपको पूरी तरह से Rebol का उपयोग करना है?
रिवाल्डफॉल

1
हाँ। यह वास्तव में सामान्य रूप से तुल्यकालिक संचार की तुलना में Rebol 3 के बारे में अधिक प्रश्न है।
शिक्सिन ज़ेंग

जवाबों:


1

क्यों आप एक प्रकार का "बफ़र" फंक्शन बनाने के लिए नहीं करते हैं जो कि सभी प्रोग्राम्स को एप्रिनोरस एंट्रीज़ से प्राप्त करते हैं और उन्हें FIFO (पहली-पहली, पहली-आउट) के रूप में प्रोसेस करते हैं?

इस तरह से आप अपने पोर्ट्स की Assync विशेषताओं को रख सकते हैं और उन्हें सिंक मोड में संसाधित कर सकते हैं।


0

ऐसे मामलों में जहां केवल अतुल्यकालिक घटनाएं होती हैं और हमें समकालिक उत्तर की आवश्यकता होती है, टाइमआउट के लिए टाइमर या नींद शुरू करें, यदि हैंडलर या आवश्यक उद्देश्य पूरा हो जाता है, तो सच कहें, और गलत है और सुनिश्चित करें कि ईवेंट रद्द हो जाता है / रीसेट हो जाता है। वही अगर महत्वपूर्ण है।


0

मुझे लगता है कि 2 डिज़ाइन समस्याएं हैं (शायद हाथ में उपकरण / समाधान के लिए आंतरिक)।

  1. Waitबहुत ज्यादा कर रही है - it will check events for all open ports। एक ध्वनि वातावरण में, प्रतीक्षा को केवल उसी स्थान पर लागू किया जाना चाहिए जहां इसकी आवश्यकता है: प्रति डिवाइस, प्रति पोर्ट, प्रति सॉकेट ... साझा संसाधनों के बीच अनावश्यक अंतर-निर्भरता बनाना अच्छी तरह से समाप्त नहीं हो सकता है - विशेष रूप से उस साझा संसाधनों (अंतर-निर्भरता के बिना भी) को जानना बहुत सारी समस्याएं पैदा कर सकता है।

  2. ईवेंट हैंडलर बहुत अधिक कर सकते हैं। एक ईवेंट हैंडलर जितना संभव हो उतना छोटा होना चाहिए, और यह केवल ईवेंट को संभालना चाहिए। यदि अधिक है, तो हैंडलर बहुत अधिक कर रहा है - खासकर अगर अन्य साझा संसाधनों को शामिल करता है। कई स्थितियों में, हैंडलर सिर्फ डेटा को बचाता है जो अन्यथा खो जाएगा; और एक अतुल्यकालिक काम अधिक जटिल चीजें करेगा।


-1

आप केवल एक लॉक का उपयोग कर सकते हैं। कम्यूनिकेशन 1 कुछ ग्लोबल लॉक स्टेट को सेट कर सकता है यानी एक वेरिएबल के साथ (सुनिश्चित करें कि यह थ्रेड सेफ है)। locked = true। तब Communication2 तब तक प्रतीक्षा कर सकता है जब तक कि यह अनलॉक न हो जाए।

loop do
    sleep 10ms
    break if not locked
end
locked = true
handle_communication()

1
यह वास्तव में सामान्य रूप से तुल्यकालिक संचार की तुलना में Rebol 3 के बारे में अधिक प्रश्न है।
शिक्सिन ज़ेंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.