Qual è la differenza tra uno stream e una coda?


13

Qual è la differenza tra uno stream e una coda? Entrambi hanno il concetto di un insieme ordinato di elementi, ma tendono ad avere implementazioni diverse e un vocabolario diverso di 'insert' / 'extract' (stream) vs. 'enqueue' / 'dequeue' (queue). Sono intercambiabili? Suggeriscono concetti o modelli diversi? In tal caso, quali sono le differenze?


Apparentemente "stream" si riferisce a cose diverse in contesti diversi. Esistono differenze nelle caratteristiche tra un flusso di caratteri rispetto all'interfaccia IStream di Windows in COM rispetto a un flusso di eventi in architettura. Puoi chiarire?
rwong

Un boscaiolo raccoglie un po 'd'acqua da un ruscello, ma non consumano tutta l'acqua. Quindi c'è la sensazione di raccogliere un importo da un flusso senza consumarlo interamente. D'altra parte, gli elementi in una coda potrebbero essere esauriti.
emallove,

Risposte:


11

Un flusso non è in realtà una struttura di dati in quanto tale (concettualmente), ma è una sequenza di segnali coerenti codificati digitalmente (pacchetti di dati o pacchetti di dati) utilizzati per trasmettere o ricevere informazioni ". Quindi sostanzialmente una sequenza di dati.

Una coda è un semplice meccanismo FIFO che ti consente di aggiungere elementi sul retro della coda o prendere dalla parte anteriore.

Gli stream hanno sempre un'origine, ad esempio un file, un percorso di rete, ecc. Una coda non contiene intrinsecamente alcun dato.

Quindi essenzialmente sono piuttosto diversi nel concetto e, come ha sottolineato Mason, sono usati in modo diverso.


In realtà esiste una struttura di dati chiamata "stream", con (effettivamente) un elenco di dati da consumare, con una funzione produttore alla sua coda, richiamabile se hai bisogno di più elementi.
Vatine,

Il comando "yes" di Unix appare come un flusso ma non ha un'origine dati particolare.
JBR Wilkinson,

@JBRWilkinson: eseguito senza argomento, l'origine dati per yes(1)è la stringa predefinita incorporata. Esegui con un argomento, è qualunque sia l'argomento fornito.
Blrfl,

Sì, hai ragione: tutti i dati devono provenire da qualche parte. Forse il vero punto qui è che una coda potrebbe essere vuota e un flusso, per definizione, di solito non lo è?
JBR Wilkinson,

2
@JBRWilkinson Non è così. In Scheme, (stream)restituisce un flusso vuoto. Inoltre, questa risposta è errata, un flusso è una struttura di dati, i flussi potrebbero non avere una fonte e i flussi non contengono intrinsecamente alcun dato, possono essere nulli o nulli o l'elenco vuoto. Vedi SRFI-41 per maggiori informazioni.
tata

5

La differenza di base sta nel modo in cui vengono utilizzati. In uno stream, di solito si utilizza solo un lato dell'operazione: si apre uno stream per leggere o scrivere, ma non entrambi. Considerando che con una coda, stai mettendo gli oggetti e togliendoli.

Inoltre, le code sono molto rigide riguardo all'ordine in cui le metti e le togli, mentre i flussi spesso (ma non sempre) supportano Seekun'operazione, specialmente se stai leggendo da loro.


3
FileStreampuò essere aperto in ReadWritemodalità.
Robert Harvey,

2
..e le code di priorità offrono opzioni sull'ordine
Petter Nordlander,

5

Nella mia esperienza, uno stream è una sequenza di byte che vengono prodotti / consumati alla velocità spesso determinata dai dati all'interno dello stream. Ad esempio, un flusso di dati MPEG avrà intestazioni di frame che descrivono cosa fa la prossima sequenza di byte e quanti devono essere consumati. La serializzazione binaria di un documento sarebbe simile. Non è sempre auto-descrittivo: la scrittura su STDOUT può essere eseguita in maniera fluida, ma può essere un dato umanamente leggibile / non analizzabile.

Al contrario, una coda è generalmente di un tipo ben noto di oggetti (o oggetti che supportano l'interfaccia) che vengono consumati nella loro interezza. Un esempio potrebbe essere una coda di lavori di database che vengono elaborati da un numero di lavoratori del database.


5

Una differenza tra uno stream e una coda è il modo in cui viene controllata la velocità dei dati:

  • in una coda, il mittente si adatta alla velocità del lettore. Il mittente decide cosa fare se la coda è piena: attendere la disponibilità della coda o eliminare i dati.

  • in un flusso, il lettore si adatta alla velocità del mittente, il lettore decide cosa fare se arrivano nuovi dati prima che quelli vecchi siano stati consumati.

Con questa prospettiva, i flussi di caratteri come le pipe Unix non si qualificherebbero come flussi ma come code.


Nello streaming video adattivo, il server si adatterà a un flusso di fedeltà inferiore perché il client non tiene il passo.
JBR Wilkinson,

@JBRWilkinson - Nello streaming video adattivo , il server invia semplicemente più varianti di uno stream a velocità di bit diverse. Questa è ancora la responsabilità del cliente di scegliere tra questi flussi.
mouviciel,

Sì, lo streaming HTTP lo fa. Intendevo la videochiamata punto-punto e i dati non sono pre-codificati. Mio male - avrei dovuto essere esplicito.
JBR Wilkinson,

L'intenzione di un flusso di caratteri è che i dati vengano consumati più o meno man mano che vengono prodotti: è un flusso di dati piuttosto che un mezzo per conservarli. Sappiamo che questo non è perfetto nella pratica, ma da un punto di vista metaforico si prevede che sia vero: il lettore può elaborare il flusso velocemente non appena arriva.

5

Se pensiamo più visivamente al modo in cui le parole sono comunemente usate , possiamo evitare il disordine di usi specifici da parte di linguaggi e implementazioni particolari, in modo che questi termini possano effettivamente significare qualcosa:

  • Una fila di persone attende in fila e viene servita una ad una. Altre persone si uniscono alla coda alla coda. Tutti attendono che il servizio proceda e il tempo di servizio dovrebbe variare. Puoi parlare di quante persone sono servite in totale.
  • Un flusso di persone, ad esempio lasciando un edificio attraverso una porta, non vengono serviti uno per uno, passano solo il punto di uscita a un ritmo più o meno costante. I ritardi non sono previsti e non sono ben tollerati. Puoi parlare di un tasso di persone: uno al secondo.

Questa è l'intenzione di questi termini. Sono metafore. (come tutto il resto) (Shhh! Rovinerai la storia!)


2

Una coda è un concetto di livello superiore rispetto a uno stream. Gli elementi di base di una coda sono un messaggio / oggetto, che è una struttura di dati coerente (di solito tipizzata) che può essere interpretata dal consumatore da sola. D'altra parte, alla base di un flusso , ci sono bit / byte / caratteri (di solito a dimensione fissa) che, di per sé, di solito non hanno senso per l'applicazione. Una sequenza di questi caratteri può comporre un "messaggio", ma un'API stream lascia all'applicazione la divisione della sequenza di caratteri in blocchi sensibili.

Un'API Stream di solito consente anche letture e scritture parziali, se i buffer di flusso sono pieni e l'altro lato non sta leggendo / scrivendo; le applicazioni che gestiscono le code di solito si aspettano che la coda gestisca queste internamente.

Una coda può essere implementata su uno stream, questo è fatto implementando l'inquadramento dei messaggi. Ad esempio, TCP fornisce un'interfaccia di flusso, HTTP si basa su TCP e aggiunge l'inquadramento dei messaggi utilizzando la codifica di trasferimento Content-Length / chunked. Gli utenti di un'API di connessione HTTP vengono sottratti dalla gestione della suddivisione del flusso di connessione HTTP in richieste HTTP.

D'altra parte, di solito, ha meno senso implementare un'API stream in cima a una coda, poiché la gestione dell'inquadramento dei messaggi aggiunge un sovraccarico non necessario.


Vale la pena aggiungere che l'API per la coda generalmente produce / consuma un singolo elemento alla volta, mentre l'API di streaming generalmente produce / consuma più "parole" alla volta. Anche se concordo, la caratteristica distintiva è che una coda di alto livello e strutturata, mentre un flusso è di basso livello e senza struttura.
Alexey,

0

Nei linguaggi di programmazione funzionale (es. Scala), e forse anche in altri linguaggi, i flussi sono molto più simili agli elenchi funzionali e sono code. Devo notare, tuttavia, che le code possono essere effettivamente implementate utilizzando una coppia di elenchi . A Scala e probabilmente altrove, uno Stream è solo un Elenco pigro - più specificamente, la coda dell'elenco è un lazy val.

Gli stream funzionali possono condividere alcune somiglianze con le code, al contrario degli elenchi, in quanto puoi usarli in modo da non mantenere un riferimento all'intestazione del flusso, ma devi fare attenzione: https: // stackoverflow.com/a/5159356/3096687 . Questo è in qualche modo analogo a una chiamata dequeue a una coda (anche se nel caso di uno stream, lo fai implicitamente: http://daily-scala.blogspot.com/2010/01/streams-2-stream-construction.html ).


-1

Stream è un concetto / framework per produrre e consumare una sequenza infinita di dati in serie o paralleli o in blocco. Que è una struttura di dati attraverso la quale è possibile implementare il flusso. proprio come list o seq attraverso cui è possibile implementare stream.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.