Apa perbedaan antara aliran dan antrian?

13

Apa perbedaan antara aliran dan antrian? Mereka berdua memiliki konsep elemen yang teratur, tetapi cenderung memiliki implementasi yang berbeda dan kosakata yang berbeda dari 'sisipkan' / 'ekstrak' (stream) vs. 'enqueue' / 'dequeue' (antrian). Apakah ini bisa dipertukarkan? Apakah mereka menyarankan konsep atau pola yang berbeda? Jika demikian, apa perbedaannya?

elliot42
sumber
Rupanya "aliran" mengacu pada hal-hal yang berbeda dalam konteks yang berbeda. Ada perbedaan karakteristik antara aliran karakter vs antarmuka Windows IStream di COM vs aliran acara dalam arsitektur berbicara. Bisakah Anda mengklarifikasi?
rwong
Seorang tukang kayu mengumpulkan air dari sungai, tetapi mereka tidak mengkonsumsi semua air. Jadi ada perasaan mengumpulkan jumlah dari aliran tanpa sepenuhnya memakannya. Di sisi lain, item dalam antrian mungkin habis.
emallove

Jawaban:

11

Sebuah aliran tidak benar-benar struktur data seperti itu (konseptual), tetapi urutan sinyal koheren dikodekan secara digital (paket data atau paket data) yang digunakan untuk mengirimkan atau menerima informasi". Jadi pada dasarnya urutan data.

Sebuah antrian adalah mekanisme FIFO sederhana yang memungkinkan Anda untuk menambahkan item ke belakang antrian atau mengambil dari depan.

Streaming selalu memiliki sumber, mis. File, lokasi jaringan, dll. Antrian tidak mengandung data apa pun.

Jadi pada dasarnya mereka sangat berbeda dalam konsep dan seperti yang ditunjukkan Mason, mereka digunakan secara berbeda.

Gelombang panas
sumber
Sebenarnya ada struktur data yang disebut "aliran", dengan (secara efektif) daftar data untuk dikonsumsi, dengan fungsi produsen di ujungnya, dapat dipanggil jika Anda membutuhkan lebih banyak elemen.
Vatine
Perintah Unix 'ya' terlihat seperti aliran tetapi tidak memiliki sumber data tertentu.
JBRWilkinson
@ JBRWilkinson: Jalankan tanpa argumen, sumber data untuk yes(1)adalah string bawaan yang tertanam. Jalankan dengan argumen, itu pun yang disediakan argumen.
Blrfl
Ya, Anda benar - semua data harus berasal dari suatu tempat. Mungkin poin sebenarnya di sini adalah bahwa antrian bisa kosong dan aliran, menurut definisi, biasanya tidak?
JBRWilkinson
2
@ JBRWilkinson Bukan itu masalahnya. Dalam Skema, (stream)mengembalikan aliran kosong. Juga, jawaban ini salah, stream adalah struktur data, stream mungkin tidak memiliki sumber, dan stream tidak mengandung data apa pun, mereka mungkin nihil atau nol atau daftar kosong. Lihat SRFI-41 untuk info lebih lanjut.
pengasuh
5

Perbedaan mendasar adalah cara mereka digunakan. Dalam aliran, Anda biasanya hanya menggunakan satu sisi operasi: Anda membuka aliran untuk membaca, atau menulis, tetapi tidak keduanya. Sedangkan dengan antrian, Anda meletakkan barang dan melepasnya.

Juga, antrian sangat ketat tentang urutan di mana Anda meletakkan sesuatu dan melepasnya, sementara aliran sering (tetapi tidak selalu) mendukung Seekoperasi, terutama jika Anda membaca dari mereka.

Mason Wheeler
sumber
3
FileStreamdapat dibuka dalam ReadWritemode.
Robert Harvey
2
Antrian ..dan prioritas memberikan opsi tentang pesanan
Petter Nordlander
5

Dalam pengalaman saya, aliran adalah urutan byte yang diproduksi / dikonsumsi pada tingkat yang sering ditentukan oleh data dalam aliran. Misalnya, aliran data MPEG akan memiliki bingkai header yang menggambarkan apa urutan byte berikutnya dan berapa banyak yang perlu dikonsumsi. Serialisasi biner dari suatu dokumen akan serupa. Ini tidak selalu menggambarkan diri sendiri: menulis ke STDOUT dapat dilakukan dengan cara yang bijaksana, tetapi mungkin berupa data yang bisa dibaca secara manusia / tidak dapat diurai.

Sebaliknya, antrian biasanya dari jenis objek yang terkenal (atau objek yang mendukung antarmuka) yang dikonsumsi secara keseluruhan. Contohnya mungkin berupa antrian pekerjaan basis data yang diproses oleh sejumlah pekerja basis data.

JBRWilkinson
sumber
5

Perbedaan antara aliran dan antrian adalah cara laju data dikontrol:

  • dalam antrian, pengirim menyesuaikan dengan kecepatan pembaca. Pengirim memutuskan apa yang harus dilakukan jika antrian penuh: menunggu ketersediaan antrian atau membuang data.

  • dalam aliran, pembaca menyesuaikan dengan kecepatan pengirim, Pembaca memutuskan apa yang harus dilakukan jika data baru tiba sebelum yang lama dikonsumsi.

Dengan perspektif itu, stream karakter seperti pipa Unix tidak akan memenuhi syarat sebagai stream tetapi sebagai antrian.

mouviciel
sumber
Dalam streaming video adaptif, server akan menyesuaikan ke aliran kesetiaan yang lebih rendah karena klien tidak mengikuti.
JBRWilkinson
@JBRWilkinson - Dalam streaming video adaptif , server hanya mengirim beberapa varian aliran dengan laju bit berbeda. Ini masih merupakan tanggung jawab klien untuk memilih di antara aliran-aliran ini.
mouviciel
Ya, streaming HTTP melakukan itu. Maksud saya panggilan video yang point-to-point dan data tidak pra-encoded. Buruk saya - saya seharusnya eksplisit.
JBRWilkinson
Maksud dari aliran karakter adalah bahwa data dikonsumsi lebih atau kurang seperti yang dihasilkan: itu adalah aliran data daripada sarana untuk menahannya. Kita tahu bahwa ini tidak sempurna dalam praktik, tetapi dari sudut pandang metaforis diharapkan benar: pembaca dapat memproses aliran secepat masuk.
5

Jika kita berpikir secara lebih visual tentang bagaimana kata-kata tersebut umum digunakan , kita dapat menghindari kekacauan penggunaan khusus oleh bahasa dan implementasi tertentu, sehingga istilah-istilah ini sebenarnya dapat berarti sesuatu:

  • Sebuah antrian orang menunggu di baris dan dilayani satu per satu. Lebih banyak orang bergabung dengan antrian di bagian ekor. Semua orang menunggu saat layanan berlangsung dan waktu layanan diharapkan bervariasi. Anda dapat berbicara tentang berapa banyak orang yang dilayani secara total.
  • Sebuah aliran orang, misalnya meninggalkan gedung melalui pintu, tidak dilayani satu per satu, mereka hanya melewati titik keluar pada tingkat yang lebih-atau-kurang mantap. Penundaan tidak diharapkan dan tidak ditoleransi dengan baik. Anda dapat berbicara tentang tingkat orang: satu per detik.

Itulah maksud dari istilah-istilah ini. Itu adalah metafora. (Seperti yang lainnya) (Ssst! Anda akan merusak ceritanya!)


sumber
2

Antrian adalah konsep tingkat yang lebih tinggi daripada aliran. Elemen dasar dari antrian adalah pesan / objek, yang merupakan struktur data yang koheren (biasanya diketik) yang dapat ditafsirkan oleh konsumen sendiri. Di sisi lain, di dasar aliran , ada (biasanya ukuran tetap) bit / byte / karakter, yang, dengan sendirinya, biasanya tidak berarti bagi aplikasi. Urutan karakter-karakter ini dapat membentuk "pesan", tetapi aliran API membiarkannya ke aplikasi untuk membagi urutan karakter menjadi potongan-potongan yang masuk akal.

Aliran API biasanya juga memungkinkan sebagian membaca dan menulis, jika buffer aliran penuh dan pihak lain tidak membaca / menulis; aplikasi yang menangani antrian biasanya mengharapkan antrian untuk menangani ini secara internal.

Antrian dapat diterapkan di atas aliran, ini dilakukan dengan menerapkan pembingkaian pesan. Misalnya, TCP menyediakan antarmuka aliran, HTTP dibangun di atas TCP, dan menambahkan framing pesan menggunakan Content-Length / chunked transfer encoding. Pengguna API Koneksi HTTP diabstraksikan dari berurusan dengan pemisahan aliran koneksi HTTP ke permintaan HTTP.

Di sisi lain, biasanya, kurang masuk akal untuk mengimplementasikan stream API di atas antrian, karena penanganan framing pesan menambah overhead yang tidak perlu.

Lie Ryan
sumber
Layak untuk menambahkan bahwa API untuk antrian umumnya menghasilkan / menggunakan elemen tunggal pada satu waktu, sementara streaming API umumnya menghasilkan / mengkonsumsi beberapa "kata" sekaligus. Meskipun saya setuju, bahwa karakteristik yang menentukan adalah bahwa antrian tingkat tinggi dan terstruktur, sedangkan aliran tingkat rendah dan struktur-kurang.
Alexey
0

Dalam bahasa pemrograman fungsional (misalnya Scala), dan mungkin bahasa lain juga, stream benar-benar lebih mirip daftar fungsional dan mereka adalah antrian. Saya harus mencatat, bagaimanapun, antrian benar-benar dapat diimplementasikan menggunakan sepasang daftar . Dalam Scala dan mungkin di tempat lain, Stream hanyalah Daftar malas - lebih khusus, ekor daftar adalah a lazy val.

Aliran fungsional dapat berbagi beberapa kesamaan dengan antrian, sebagai lawan dari, daftar, di mana Anda dapat menggunakannya dengan cara yang Anda tidak menyimpan referensi ke kepala aliran - tetapi Anda harus berhati-hati: https: // stackoverflow.com/a/5159356/3096687 . Ini agak analog dengan panggilan dequeue ke antrian (meskipun dalam kasus streaming, Anda melakukannya secara implisit: http://daily-scala.blogspot.com/2010/01/streams-2-stream-construction.html ).

bbarker
sumber
-1

Stream adalah konsep / kerangka kerja untuk menghasilkan dan mengkonsumsi urutan data tak terbatas secara serial atau paralel atau massal. Que adalah struktur data melalui mana aliran dapat diimplementasikan. seperti daftar atau seq di mana aliran dapat diimplementasikan.

pengguna3423890
sumber