एक धारा और एक कतार के बीच अंतर क्या है?


13

एक धारा और एक कतार के बीच अंतर क्या है? उन दोनों के पास तत्वों के एक निर्धारित सेट की अवधारणा है, लेकिन अलग-अलग कार्यान्वयन और 'इन्सर्ट' / 'एक्सट्रैक्ट' (स्ट्रीम) बनाम 'एन्क्यू' / 'डेक्यू' (कतार) की एक अलग शब्दावली है। क्या ये विनिमेय हैं? क्या वे विभिन्न अवधारणाओं या पैटर्न का सुझाव देते हैं? यदि हां, तो अंतर क्या हैं?


जाहिरा तौर पर "धारा" अलग-अलग संदर्भों में अलग-अलग चीजों को संदर्भित करता है। COM में एक चरित्र स्ट्रीम बनाम विंडोज IStream इंटरफ़ेस के बीच विशेषताओं में अंतर हैं। आर्किटेक्चर स्पोक में एक घटना स्ट्रीम बनाम। क्या आप स्पष्ट कर सकते हो?
rwong

एक वुड्समैन एक धारा से कुछ पानी इकट्ठा करता है, लेकिन वे सभी पानी का उपभोग नहीं करते हैं । इसलिए पूरी तरह से उपभोग किए बिना एक धारा से एक राशि इकट्ठा करने की भावना है। दूसरी ओर, एक कतार में आइटम समाप्त हो सकते हैं।
इमल्लोवे

जवाबों:


11

एक धारा वास्तव में एक डेटा संरचना नहीं है जैसे कि (वैचारिक रूप से), लेकिन डिजिटल रूप से एन्कोडेड सुसंगत संकेतों (डेटा या डेटा पैकेट के पैकेट) का एक क्रम है जो सूचना प्रसारित या प्राप्त करने के लिए उपयोग किया जाता है ”। तो मूल रूप से डेटा का एक क्रम है।

एक कतार एक साधारण FIFO तंत्र है जो आपको कतार के पीछे से आइटम जोड़ने या सामने से लेने की अनुमति देता है।

धाराओं में हमेशा एक स्रोत होता है, जैसे फ़ाइल, नेटवर्क स्थान, आदि। कतार में स्वाभाविक रूप से कोई डेटा नहीं होता है।

इसलिए अनिवार्य रूप से वे अवधारणा में काफी भिन्न हैं और जैसा कि मेसन ने बताया, उनका उपयोग अलग-अलग तरीके से किया जाता है।


वास्तव में एक डेटा संरचना है जिसे "स्ट्रीम" कहा जाता है, (प्रभावी रूप से) उपभोग करने के लिए डेटा की एक सूची, इसकी पूंछ पर एक निर्माता फ़ंक्शन के साथ, कॉल करने योग्य यदि आपको अधिक तत्वों की आवश्यकता होती है।
वेटिन

यूनिक्स 'हाँ' कमांड एक स्ट्रीम की तरह दिखता है लेकिन इसका कोई विशेष डेटा स्रोत नहीं है।
JBRWilkinson

@JBRWilkinson: एक तर्क के बिना चलाएँ, के लिए डेटा स्रोत yes(1)एम्बेडेड डिफ़ॉल्ट स्ट्रिंग है। एक तर्क के साथ चलें, यह जो भी तर्क प्रदान करता है।
ब्लरफ्ल

हां, आप सही हैं - सभी डेटा को कहीं से आना होगा। शायद यहां वास्तविक बिंदु यह है कि एक कतार खाली हो सकती है और एक धारा, परिभाषा से, आमतौर पर नहीं होती है?
JBRWilkinson

2
@JBRWilkinson ऐसा नहीं है। स्कीम में, (stream)एक खाली स्ट्रीम लौटाता है। इसके अलावा, यह उत्तर गलत है, एक धारा एक डेटा संरचना है, धाराओं में कोई स्रोत नहीं हो सकता है, और धाराओं में स्वाभाविक रूप से कोई डेटा नहीं होता है, वे शून्य या शून्य या रिक्त सूची हो सकती हैं। अधिक जानकारी के लिए SRFI-41 देखें ।
नानी

5

मूल अंतर उनके उपयोग करने के तरीके में है। एक स्ट्रीम में, आप आमतौर पर ऑपरेशन के केवल एक पक्ष का उपयोग करते हैं: आप पढ़ने या लिखने के लिए एक स्ट्रीम खोलते हैं, लेकिन दोनों नहीं। जबकि एक कतार के साथ, आप आइटम डाल रहे हैं और उन्हें बंद कर रहे हैं।

इसके अलावा, कतारें उस आदेश के बारे में बहुत सख्त हैं जिसमें आप चीजों को डालते हैं और उन्हें बंद कर देते हैं, जबकि अक्सर धाराएं (लेकिन हमेशा नहीं) एक Seekऑपरेशन का समर्थन करती हैं , खासकर यदि आप उनसे पढ़ रहे हैं।


3
FileStreamReadWriteमोड में खोला जा सकता है।
रॉबर्ट हार्वे

2
..और प्राथमिकता कतारें आदेश के बारे में विकल्प देती हैं
पीटर नॉर्डलैंडर

5

मेरे अनुभव में, एक स्ट्रीम बाइट्स का एक क्रम है जो धारा के भीतर डेटा द्वारा निर्धारित दर पर अक्सर उत्पादित / खपत होती है। उदाहरण के लिए, एक एमपीईजी डेटा स्ट्रीम में फ्रेम हेडर होंगे जो वर्णन करते हैं कि बाइट्स का अगला क्रम क्या है और कितने उपभोग करने की आवश्यकता है। किसी दस्तावेज़ का द्विआधारी क्रमांकन समान होगा। यह हमेशा स्वयं-वर्णन नहीं होता है: STDOUT पर लिखना एक स्ट्रीम-वार तरीके से किया जा सकता है लेकिन यह मानवीय रूप से पठनीय / गैर-पार्स करने योग्य डेटा हो सकता है।

इसके विपरीत, एक कतार आमतौर पर एक प्रसिद्ध प्रकार की वस्तु (या इंटरफ़ेस-सपोर्टिंग ऑब्जेक्ट) होती है जो उनकी संपूर्णता में खपत होती है। एक उदाहरण डेटाबेस नौकरियों की एक कतार हो सकता है जो कई डेटाबेस श्रमिकों द्वारा संसाधित होते हैं।


5

एक धारा और एक कतार के बीच अंतर डेटा की दर को नियंत्रित करने का तरीका है:

  • एक कतार में, प्रेषक पाठक की गति के अनुरूप होता है। प्रेषक यह तय करता है कि यदि कतार भरी है तो क्या करें: कतार की उपलब्धता की प्रतीक्षा करें या डेटा को फेंक दें।

  • एक धारा में, पाठक प्रेषक की गति को स्वीकार करता है, पाठक तय करता है कि पुराने डेटा के उपभोग से पहले नया डेटा आने पर क्या करना है।

उस परिप्रेक्ष्य से, यूनिक्स पाइप जैसे चरित्र धाराएँ धाराओं के रूप में नहीं बल्कि कतारों के रूप में योग्य होंगी।


अनुकूली वीडियो स्ट्रीमिंग में, सर्वर एक कम निष्ठा धारा को समायोजित करेगा क्योंकि क्लाइंट नहीं रख रहा है।
JBRWilkinson

@JBRWilkinson - अनुकूली वीडियो स्ट्रीमिंग में , सर्वर अलग-अलग बिट दरों पर एक स्ट्रीम के कई वेरिएंट भेजता है। यह अभी भी ग्राहक की जिम्मेदारी है कि वह इन धाराओं के बीच चयन करे।
मौविइल

हाँ, HTTP स्ट्रीमिंग ऐसा करती है। मेरा मतलब वीडियो कॉलिंग था जो पॉइंट-टू-पॉइंट है और डेटा प्री-एनकोडेड नहीं है। मेरा बुरा - मुझे स्पष्ट होना चाहिए था।
JBRWilkinson

एक चरित्र धारा का अभिप्राय यह है कि डेटा का उत्पादन अधिक-या-कम किया जाता है, क्योंकि यह डेटा का प्रवाह होता है, बजाय इसे रखने के। हम जानते हैं कि यह व्यवहार में सही नहीं है, लेकिन एक रूपक दृष्टिकोण से यह सच होने की उम्मीद है: पाठक स्ट्रीम को जितनी जल्दी हो सके उतनी तेजी से संसाधित कर सकता है।

5

यदि हम सामान्य रूप से इस बारे में अधिक सोचते हैं कि शब्दों का आमतौर पर उपयोग कैसे किया जाता है , तो हम विशेष भाषाओं और कार्यान्वयनों द्वारा विशिष्ट उपयोगों की अव्यवस्था से बच सकते हैं, ताकि इन शब्दों का वास्तव में कुछ मतलब हो सके:

  • एक कतार लाइन में लोगों इंतजार की और एक के बाद एक परोसा जाता है। अधिक लोग पूंछ में कतार में शामिल होते हैं। हर कोई सेवा के बढ़ने का इंतजार करता है और सेवा समय अलग-अलग होने की उम्मीद है। आप बोल सकते हैं कि कुल कितने लोगों की सेवा की जाती है।
  • लोगों की एक धारा , उदाहरण के लिए, एक दरवाजे के माध्यम से एक इमारत को छोड़कर, एक-एक करके सेवा नहीं की जाती है, वे बस बाहर निकलने के बिंदु को अधिक-या-कम स्थिर दर पर पास करते हैं। देरी की उम्मीद नहीं है और अच्छी तरह से सहन नहीं किया गया है। आप लोगों की दर के बारे में बात कर सकते हैं: प्रति सेकंड एक।

यही इन शब्दों का आशय है। वे रूपक हैं। (बाकी सब की तरह) (शाह! आप कहानी को बर्बाद कर देंगे!)


2

एक कतार एक धारा की तुलना में एक उच्च स्तर की अवधारणा है। एक कतार के आधार तत्व एक संदेश / वस्तु है, जो एक सुसंगत (आमतौर पर टाइप) डेटा संरचना है जो उपभोक्ता द्वारा स्वयं व्याख्या की जा सकती है। दूसरी ओर, एक धारा के आधार पर , (आमतौर पर निश्चित आकार के) बिट्स / बाइट्स / वर्ण होते हैं, जो अपने आप ही, आमतौर पर आवेदन के लिए अर्थहीन होता है। इन पात्रों का एक क्रम एक "संदेश" लिख सकता है, लेकिन एक धारा एपीआई इसे वर्णों के अनुक्रम को संवेदी विखंडू में विभाजित करने के लिए आवेदन पर छोड़ देता है।

स्ट्रीम API आमतौर पर आंशिक रीड और लिखने की भी अनुमति देता है, यदि स्ट्रीम बफ़र भरे हुए हैं और दूसरा पक्ष रीड / राइटिंग नहीं कर रहा है; अनुप्रयोग जो कतार को संभालते हैं वे आमतौर पर कतार को इन आंतरिक रूप से संभालने की अपेक्षा करते हैं।

एक धारा के शीर्ष पर एक कतार लागू की जा सकती है, यह संदेश फ़्रेमिंग को लागू करने के द्वारा किया जाता है। उदाहरण के लिए, टीसीपी एक स्ट्रीम इंटरफ़ेस प्रदान करता है, HTTP टीसीपी के शीर्ष पर बनाया गया है, और सामग्री-लंबाई / chunked हस्तांतरण एन्कोडिंग का उपयोग करके संदेश फ़्रेमिंग जोड़ता है। HTTP कनेक्शन API के उपयोगकर्ता HTTP अनुरोधों को HTTP कनेक्शन स्ट्रीम को विभाजित करने से निपटने से अमूर्त हैं।

दूसरी ओर, आमतौर पर, यह एक कतार के शीर्ष पर एक स्ट्रीम एपीआई को लागू करने के लिए कम समझ में आता है, क्योंकि संदेश फ़्रेमिंग का संचालन अनावश्यक ओवरहेड जोड़ता है।


यह जोड़ने के लायक है कि कतार के लिए एपीआई आम तौर पर एक बार में एक ही तत्व का उत्पादन / खपत करता है, जबकि स्ट्रीमिंग एपीआई आमतौर पर एक बार में कई "शब्दों" का उत्पादन / खपत करता है। हालांकि मैं सहमत हूं, कि परिभाषित करने की विशेषता यह है कि एक कतार उच्च स्तर और संरचित है, जबकि एक धारा निम्न स्तर और संरचना-कम है।
एलेक्सी

0

कार्यात्मक प्रोग्रामिंग भाषाओं में (जैसे स्काला), और शायद अन्य भाषाओं में भी, स्ट्रीम वास्तव में कार्यात्मक सूचियों की तरह अधिक हैं और वे कतार हैं। मुझे ध्यान देना चाहिए, हालांकि, सूचियों की एक जोड़ी का उपयोग करके कतारें वास्तव में लागू की जा सकती हैं । स्काला में और शायद कहीं और, एक स्ट्रीम सिर्फ एक आलसी सूची है - अधिक विशेष रूप से, सूची की पूंछ एक है lazy val

कार्यात्मक धाराएँ कुछ समानताओं को कतारों के साथ साझा कर सकती हैं, जैसा कि सूचियों के विपरीत है, इसमें आप उन्हें इस तरह से उपयोग कर सकते हैं कि आप धारा के प्रमुख का संदर्भ नहीं रखते हैं - लेकिन आपको सावधान रहना होगा: https: // stackoverflow.com/a/5159356/3096687 । यह कुछ हद तक एक कतार में एक चकमा कॉल के अनुरूप है (हालांकि एक धारा के मामले में, आप ऐसा करते हैं: http://daily-scala.blogspot.com/2010/01/streams-2-stream-construction.html )।


-1

धारा धारावाहिक या समानांतर या थोक के अनंत अनुक्रम का उत्पादन और उपभोग करने के लिए एक अवधारणा / रूपरेखा है। Que एक डेटा संरचना है जिसके माध्यम से धारा को लागू किया जा सकता है। बस सूची या seq की तरह जिसके माध्यम से धारा को लागू किया जा सकता है।

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