ความแตกต่างระหว่างสตรีมและคิวคืออะไร


13

ความแตกต่างระหว่างสตรีมและคิวคืออะไร พวกเขาทั้งสองมีแนวคิดของชุดองค์ประกอบที่เรียงลำดับ แต่มีแนวโน้มที่จะมีการใช้งานที่แตกต่างกันและคำศัพท์ที่แตกต่างกันของ 'แทรก' / 'แยก' (กระแส) กับ 'enqueue' / 'dequeue' (คิว) สามารถเปลี่ยนได้เหล่านี้หรือไม่ พวกเขาแนะนำแนวคิดหรือรูปแบบที่แตกต่างกันหรือไม่? ถ้าเป็นเช่นนั้นอะไรคือความแตกต่าง?


เห็นได้ชัดว่า "กระแส" หมายถึงสิ่งต่าง ๆ ในบริบทที่แตกต่างกัน มีความแตกต่างในลักษณะระหว่างตัวละครสตรีมกับอินเตอร์เฟซ Windows IStream ใน COMกับกระแสเหตุการณ์ในสถาปัตยกรรมพูด คุณช่วยอธิบายได้ไหม

พรานรวบรวมน้ำบางส่วนจากกระแส แต่พวกเขาไม่ได้กินทุกน้ำ ดังนั้นจึงมีความรู้สึกของการรวบรวมจำนวนเงินจากกระแสโดยไม่ต้องบริโภคทั้งหมด ในทางกลับกันรายการในคิวอาจจะหมด
emallove

คำตอบ:


11

กระแสไม่ได้จริงๆโครงสร้างข้อมูลดังกล่าว (แนวคิด) แต่เป็นลำดับของสัญญาณเชื่อมโยงกันแบบดิจิทัลเข้ารหัส (แพ็คเก็ตของข้อมูลหรือแพ็กเก็ตข้อมูล) ที่ใช้ในการส่งหรือรับข้อมูล". ดังนั้นโดยทั่วไปลำดับของข้อมูล

คิวเป็นกลไก FIFO ง่ายช่วยให้คุณสามารถเพิ่มรายการไปยังด้านหลังของคิวหรือใช้จากด้านหน้า

สตรีมมีแหล่งที่มาเสมอเช่นไฟล์ตำแหน่งเครือข่าย ฯลฯ คิวไม่ได้มีข้อมูลใด ๆ

ดังนั้นโดยพื้นฐานแล้วพวกเขาจะค่อนข้างแตกต่างกันในแนวคิดและเมื่อเมสันชี้ให้เห็นพวกเขาจะใช้แตกต่างกัน


จริงๆแล้วมีโครงสร้างข้อมูลที่เรียกว่า "สตรีม" พร้อมด้วยรายการข้อมูลที่ใช้งานได้อย่างมีประสิทธิภาพด้วยฟังก์ชั่นผู้ผลิตที่ส่วนท้ายสามารถเรียกใช้งานได้หากคุณต้องการองค์ประกอบเพิ่มเติม
Vatine

คำสั่ง Unix 'ใช่' ดูเหมือนเป็นกระแสข้อมูล แต่ไม่มีแหล่งข้อมูลเฉพาะ
JBRWilkinson

@JBRWilkinson: เรียกใช้โดยไม่มีอาร์กิวเมนต์แหล่งข้อมูลสำหรับyes(1)เป็นสตริงเริ่มต้นที่ฝังอยู่ เรียกใช้ด้วยอาร์กิวเมนต์มันเป็นสิ่งที่ให้อาร์กิวเมนต์
Blrfl

ใช่คุณพูดถูก - ข้อมูลทั้งหมดมาจากที่อื่น บางทีจุดที่แท้จริงที่นี่คือคิวอาจว่างเปล่าและสตรีมตามคำนิยามมักจะไม่?
JBRWilkinson

2
@JBRWilkinson ไม่เป็นเช่นนั้น ใน Scheme (stream)ส่งคืนสตรีมที่ว่างเปล่า นอกจากนี้คำตอบนี้ไม่ถูกต้องสตรีมเป็นโครงสร้างข้อมูลสตรีมอาจไม่มีแหล่งที่มาและสตรีมไม่ได้มีข้อมูลใด ๆ โดยกำเนิดพวกเขาอาจเป็นศูนย์หรือโมฆะหรือรายการว่างเปล่า ดูSRFI-41สำหรับข้อมูลเพิ่มเติม
พี่เลี้ยง

5

ความแตกต่างพื้นฐานคือวิธีการใช้งาน ในสตรีมคุณมักจะใช้เพียงด้านเดียวของการดำเนินการ: คุณเปิดสตรีมเพื่ออ่านหรือเขียน แต่ไม่ใช่ทั้งสองอย่าง ในขณะที่มีคิวคุณกำลังวางรายการและถอดออก

นอกจากนี้คิวยังเข้มงวดมากเกี่ยวกับลำดับที่คุณวางสิ่งต่าง ๆ และนำออกในขณะที่สตรีมบ่อย ๆ (แต่ไม่เสมอไป) สนับสนุนการSeekดำเนินการโดยเฉพาะอย่างยิ่งถ้าคุณกำลังอ่านจากพวกเขา


3
FileStreamสามารถเปิดได้ในReadWriteโหมด
Robert Harvey

2
.. และคิวลำดับความสำคัญมีตัวเลือกเกี่ยวกับการสั่งซื้อ
Petter Nordlander

5

จากประสบการณ์ของฉันสตรีมเป็นลำดับของไบต์ที่ผลิต / บริโภคในอัตราที่มักถูกกำหนดโดยข้อมูลภายในสตรีม ตัวอย่างเช่นสตรีมข้อมูล MPEG จะมีส่วนหัวของเฟรมซึ่งอธิบายว่าลำดับไบต์ต่อไปทำอะไรและจำเป็นต้องใช้จำนวนเท่าใด การทำให้เป็นเลขฐานสองของเอกสารจะคล้ายกัน มันไม่ได้อธิบายตนเองเสมอไป: การเขียนไปยัง STDOUT สามารถทำได้ด้วยวิธีการที่ชาญฉลาด แต่อาจเป็นข้อมูลที่มนุษย์สามารถอ่านได้ / ไม่สามารถแยกวิเคราะห์ได้

ในทางกลับกันคิวมักจะเป็นประเภทของวัตถุที่รู้จักกันดี (หรือวัตถุที่สนับสนุนอินเตอร์เฟส) ที่ถูกใช้จนหมด ตัวอย่างอาจเป็นคิวของงานฐานข้อมูลที่ประมวลผลโดยผู้ทำงานฐานข้อมูลจำนวนหนึ่ง


5

ความแตกต่างระหว่างสตรีมและคิวคือวิธีควบคุมอัตราข้อมูล:

  • ในคิวผู้ส่งปรับให้เหมาะกับความเร็วของผู้อ่าน ผู้ส่งตัดสินใจว่าจะทำอย่างไรถ้าคิวเต็ม: รอความพร้อมของคิวหรือทิ้งข้อมูล

  • ในสตรีมผู้อ่านจะปรับความเร็วของผู้ส่งผู้อ่านจะตัดสินใจว่าจะทำอย่างไรถ้าข้อมูลใหม่มาถึงก่อนที่ข้อมูลเก่าจะถูกใช้งาน

ด้วยมุมมองนั้นสตรีมอักขระเช่นไพพ์ Unix จะไม่ผ่านการคัดเลือกเป็นสตรีม แต่เป็นคิว


ในการสตรีมวิดีโอแบบปรับตัวเซิร์ฟเวอร์จะปรับเป็นสตรีมความเที่ยงตรงต่ำกว่าเนื่องจากไคลเอนต์ยังไม่ทัน
JBRWilkinson

@JBRWilkinson - ในการสตรีมวิดีโอแบบปรับตัวเซิร์ฟเวอร์เพียงแค่ส่งหลากหลายรูปแบบของสตรีมด้วยอัตราบิตที่แตกต่างกัน สิ่งนี้ยังคงเป็นความรับผิดชอบของลูกค้าในการเลือกระหว่างสตรีมเหล่านี้
mouviciel

ใช่สตรีมมิ่ง HTTP ทำเช่นนั้น ฉันหมายถึงการโทรวิดีโอซึ่งเป็นแบบจุดต่อจุดและข้อมูลไม่ได้เข้ารหัสล่วงหน้า ไม่ดีของฉัน - ฉันควรชัดเจน
JBRWilkinson

ความตั้งใจของตัวละครสตรีมคือการที่ข้อมูลถูกใช้ไปมากหรือน้อยลงตามที่สร้างขึ้น: มันเป็นการไหลของข้อมูลแทนที่จะเป็นวิธีการเก็บมันไว้ เรารู้ว่าสิ่งนี้ไม่สมบูรณ์แบบในทางปฏิบัติ แต่จากมุมมองเชิงอุปมาที่คาดว่าจะเป็นจริง: ผู้อ่านสามารถประมวลผลสตรีมได้เร็วเท่าที่เข้ามา

5

ถ้าเราคิดว่าสายตามากขึ้นเกี่ยวกับวิธีการคำที่ใช้กันโดยทั่วไปเราสามารถหลีกเลี่ยงความยุ่งเหยิงของการใช้งานที่เฉพาะเจาะจงโดยเฉพาะอย่างยิ่งภาษาและการใช้งานเพื่อให้คำเหล่านี้สามารถสิ่งที่จริงหมายถึง:

  • คิวของคนที่รออยู่ในแนวเดียวกันและจะได้รับหนึ่งโดยหนึ่ง มีคนเข้าร่วมคิวมากขึ้นที่หาง ทุกคนรอเป็นบริการดำเนินการและเวลาบริการคาดว่าจะแตกต่างกันไป คุณสามารถพูดได้ว่ามีคนรับใช้ทั้งหมดกี่คน
  • กระแสของคนเช่นออกจากอาคารผ่านประตูจะไม่ได้ทำหน้าที่อย่างใดอย่างหนึ่งโดยหนึ่งพวกเขาก็ผ่านจุดออกที่มากขึ้นหรือน้อยกว่าอัตราที่คงที่ ไม่คาดว่าจะเกิดความล่าช้าและยอมรับไม่ได้ คุณสามารถพูดถึงอัตราของผู้คน: หนึ่งต่อวินาที

นั่นคือเจตนาของข้อกำหนดเหล่านี้ พวกเขาเป็นคำอุปมาอุปมัย (เหมือนทุกสิ่งทุกอย่าง) (Shhh! คุณจะทำลายเรื่องราว!)


2

คิวเป็นแนวคิดระดับสูงกว่าสตรีม องค์ประกอบพื้นฐานของคิวคือข้อความ / วัตถุซึ่งเป็นโครงสร้างข้อมูลที่เชื่อมโยงกัน (มักพิมพ์) ที่ผู้บริโภคสามารถตีความได้ด้วยตนเอง ในทางกลับกันที่ฐานของสตรีมจะมีบิต / ไบต์ / ตัวอักษร (โดยปกติคือขนาดคงที่) ซึ่งโดยปกติแล้วจะไม่มีความหมายต่อแอปพลิเคชัน ลำดับของอักขระเหล่านี้อาจเขียนเป็น "ข้อความ" แต่สตรีม API จะปล่อยให้แอปพลิเคชันแยกลำดับของตัวอักษรออกเป็นส่วนที่สมเหตุสมผล

โดยทั่วไปสตรีม API จะอนุญาตให้อ่านและเขียนบางส่วนได้หากบัฟเฟอร์สตรีมเต็มและด้านอื่น ๆ ไม่ได้อ่าน / เขียน แอปพลิเคชันที่จัดการกับคิวมักจะคาดหวังว่าคิวจะจัดการภายในเหล่านี้

คิวอาจถูกนำไปใช้ที่ด้านบนของสตรีมซึ่งทำได้โดยการนำกรอบข้อความไปใช้ ตัวอย่างเช่น TCP จัดเตรียมอินเตอร์เฟสสตรีม HTTP ถูกสร้างขึ้นที่ด้านบนของ TCP และเพิ่มกรอบข้อความโดยใช้การเข้ารหัสการถ่ายโอนเนื้อหาความยาว / ก้อน ผู้ใช้ HTTP Connection API ถูกแยกออกจากการจัดการกับการแยกการเชื่อมต่อ HTTP กับการร้องขอ HTTP

ในทางกลับกันโดยทั่วไปจะไม่เหมาะสมที่จะใช้ stream API ที่ด้านบนของคิวเนื่องจากการจัดการของการกำหนดกรอบข้อความจะเพิ่มโอเวอร์เฮดที่ไม่จำเป็น


การเพิ่ม API นั้นสำหรับคิวโดยทั่วไปจะสร้าง / ใช้องค์ประกอบครั้งละหนึ่งรายการในขณะที่สตรีม API โดยทั่วไปจะผลิต / ใช้ "คำ" หลายครั้งในแต่ละครั้ง แม้ว่าฉันจะเห็นด้วยว่าลักษณะการกำหนดคือคิวระดับสูงและโครงสร้างในขณะที่กระแสอยู่ในระดับต่ำและไม่มีโครงสร้าง
Alexey

0

ในภาษาโปรแกรมที่ใช้งานได้ (เช่น Scala) และภาษาอื่น ๆ เช่นกันสตรีมก็เหมือนรายการทำงานและเป็นคิว ฉันควรทราบ แต่คิวสามารถจริงจะดำเนินการโดยใช้คู่แสดงรายการ ใน Scala และอาจจะเป็นที่อื่น ๆ สตรีมเป็นเพียงรายการขี้เกียจ - lazy valมากขึ้นโดยเฉพาะหางของรายการเป็น

สตรีมที่ใช้งานได้สามารถแบ่งปันความคล้ายคลึงกันกับคิวซึ่งเป็นรายการซึ่งคุณสามารถใช้ในลักษณะที่คุณไม่ได้อ้างอิงถึงส่วนหัวของสตรีม แต่คุณต้องระวัง: https: // stackoverflow.com/a/5159356/3096687 นี่ค่อนข้างคล้ายกับการเรียกคิวไปยังคิว (แม้ว่าในกรณีของสตรีมคุณทำได้โดยปริยาย: http://daily-scala.blogspot.com/2010/01/streams-2-stream-construction.html )


-1

สตรีมเป็นแนวคิด / กรอบการทำงานเพื่อสร้างและใช้ลำดับข้อมูลที่ไม่ จำกัด ลำดับหรือขนานหรือเป็นกลุ่ม Que เป็นโครงสร้างข้อมูลที่สามารถนำกระแสข้อมูลไปใช้ได้ เช่นเดียวกับ list หรือ seq ผ่านสตรีมที่สามารถใช้งานได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.