Qual è la differenza tra uno stream e una coda?

8

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

    
posta elliot42 23.05.2013 - 23:57
fonte

8 risposte

9

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

Una coda è un semplice meccanismo FIFO che ti consente di aggiungere elementi sul retro della coda o prendere in primo piano.

Gli stream hanno sempre una fonte, ad es. un file, un percorso di rete, ecc. Una coda non contiene intrinsecamente alcun dato.

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

    
risposta data 24.05.2013 - 00:45
fonte
5

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

Inoltre, le code sono molto rigide sull'ordine in cui vengono inserite le cose e le rimuovono, mentre gli stream spesso (ma non sempre) supportano un'operazione Seek , specialmente se stai leggendo da loro.

    
risposta data 24.05.2013 - 00:03
fonte
5

Nella mia esperienza, un flusso è una sequenza di byte che vengono prodotti / consumati a una frequenza spesso determinata dai dati all'interno del flusso. Ad esempio, un flusso di dati MPEG avrà intestazioni di frame che descrivono cosa fa la successiva sequenza di byte e quanti devono essere consumati. La serializzazione binaria di un documento sarebbe simile. Non è sempre auto-descrittivo: scrivere in STDOUT può essere fatto in modo stream-wise ma può essere umanamente leggibile / non analizzabile i dati.

Al contrario, una coda di solito è un tipo noto di oggetto (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.

    
risposta data 24.05.2013 - 08:39
fonte
4

Una differenza tra un flusso 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: attendi la disponibilità della coda o scarica i dati.

  • in un flusso, il lettore si adatta alla velocità del mittente. Il lettore decide cosa fare se arrivano nuovi dati prima che il vecchio sia stato consumato.

Con quella prospettiva, i flussi di caratteri come i pipe Unix non si qualificano come flussi ma come code.

    
risposta data 24.05.2013 - 09:47
fonte
4

Se pensiamo più visivamente a come le parole sono comunemente usate , possiamo evitare la confusione di usi specifici da particolari linguaggi e implementazioni, in modo che questi termini possano effettivamente significare qualcosa:

  • Una coda di persone attende in linea e viene pubblicata una per una. Altre persone si uniscono alla coda alla coda. Tutti aspettano che i proventi del servizio e il tempo di servizio dovrebbe variare. Puoi parlare di quante persone vengono servite in totale.
  • Uno flusso di persone, ad esempio lasciando un edificio attraverso una porta, non viene servito uno ad uno, ma passa il punto di uscita a una velocità più o meno costante. I ritardi non sono previsti e non sono ben tollerati. Puoi parlare di una percentuale di persone: una al secondo.

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

    
risposta data 01.12.2015 - 18:01
fonte
2

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

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

Una coda può essere implementata su uno stream, ciò avviene implementando la struttura dei messaggi. Ad esempio, TCP fornisce un'interfaccia di flusso, HTTP è costruito su TCP e aggiunge telegrammi di messaggi usando la codifica di trasferimento Content-Length / Chunked. Gli utenti di un'API di connessione HTTP sono astratti dall'affrontare lo splitting del flusso di connessioni HTTP alle richieste HTTP.

D'altra parte, in genere, ha meno senso implementare un'API di streaming su una coda, poiché la gestione del frame dei messaggi aggiunge un sovraccarico non necessario.

    
risposta data 01.05.2017 - 05:27
fonte
0

Nei linguaggi di programmazione funzionale (ad esempio Scala) e forse anche in altri linguaggi, gli stream sono in realtà più simili a elenchi funzionali e sono code. Devo notare, tuttavia, le code possono effettivamente essere implementate utilizzando un paio di elenchi . In Scala e probabilmente altrove, un flusso è solo una lista pigra - in particolare, la coda dell'elenco è un lazy val .

I flussi funzionali possono condividere alcune somiglianze con le code, al contrario di elenchi, in quanto è possibile utilizzarli in modo da non mantenere un riferimento alla testa dello stream, ma bisogna fare attenzione: < a href="https://stackoverflow.com/a/5159356/3096687"> link . Questo è in qualche modo analogo a una chiamata in coda a una coda (anche se nel caso di un flusso, lo fai in modo implicito: link ).

    
risposta data 01.12.2015 - 16:06
fonte
-1

Stream è un concetto / framework per produrre e consumare un'infinita sequenza di dati in serie o in parallelo o in blocco. Que è una struttura dati attraverso cui è possibile implementare il flusso. proprio come la lista o il seq attraverso cui il flusso può essere implementato.

    
risposta data 30.04.2017 - 13:41
fonte

Leggi altre domande sui tag