Qual é a diferença entre um fluxo e uma fila?


13

Qual é a diferença entre um fluxo e uma fila? Ambos têm o conceito de um conjunto ordenado de elementos, mas tendem a ter implementações diferentes e um vocabulário diferente de 'inserir' / 'extrair' (fluxos) vs. 'enfileirar' / 'desenfileirar' (fila). Estes são intercambiáveis? Eles sugerem conceitos ou padrões diferentes? Se sim, quais são as diferenças?


Aparentemente, "fluxo" se refere a coisas diferentes em diferentes contextos. Existem diferenças nas características entre um fluxo de caracteres e a interface do Windows IStream no COM versus um fluxo de eventos na arquitetura. Você pode esclarecer?
Rwong

Um lenhador recolhe um pouco de água de um riacho, mas não consome toda a água. Portanto, existe uma sensação de coletar uma quantidade de um fluxo sem consumi-lo totalmente. Por outro lado, itens em uma fila podem estar esgotados.
Emallove # 24/18

Respostas:


11

Um fluxo não é realmente uma estrutura de dados como tal (conceitualmente), mas é uma sequência de sinais coerentes codificados digitalmente (pacotes de dados ou pacotes de dados) usados ​​para transmitir ou receber informações ". Então, basicamente, uma sequência de dados.

Uma fila é um mecanismo FIFO simples, que permite adicionar itens ao fundo da fila ou retirar da frente.

Os fluxos sempre têm uma fonte, por exemplo, um arquivo, local de rede etc. Uma fila não contém dados inerentemente.

Então, essencialmente, eles são bastante diferentes em conceito e, como Mason apontou, são usados ​​de maneira diferente.


Na verdade, existe uma estrutura de dados chamada "fluxo", com (efetivamente) uma lista de dados a serem consumidos, com uma função de produtor em sua cauda, ​​que pode ser chamada se você precisar de mais elementos.
Vatine

O comando Unix 'yes' se parece com um fluxo, mas não possui uma fonte de dados específica.
JBRWilkinson

@JBRWilkinson: Execute sem argumento, a fonte de dados yes(1)é a string padrão incorporada. Executar com um argumento, é o que forneceu o argumento.
Blrfl

Sim, você está certo - todos os dados têm de vir de algum lugar. Talvez o ponto real aqui seja que uma fila possa estar vazia e um fluxo, por definição, geralmente não é?
JBRWilkinson

2
@JBRWilkinson Esse não é o caso. No esquema, (stream)retorna um fluxo vazio. Além disso, esta resposta está errada, um fluxo é uma estrutura de dados, os fluxos podem não ter uma fonte e os fluxos não contêm dados inerentemente, podem ser nulos ou nulos ou a lista vazia. Veja SRFI-41 para mais informações.
Nanny

5

A diferença básica está na maneira como são usadas. Em um fluxo, você geralmente usa apenas um lado da operação: você abre um fluxo para ler ou escrever, mas não ambos. Considerando que, com uma fila, você está colocando e retirando itens.

Além disso, as filas são muito rígidas quanto à ordem em que você coloca e despeja as coisas, enquanto os fluxos geralmente (mas nem sempre) suportam uma Seekoperação, principalmente se você estiver lendo.


3
FileStreampode ser aberto no ReadWritemodo
Robert Harvey

2
..e filas de prioridade dá opções sobre a ordem
Petter Nordlander

5

Na minha experiência, um fluxo é uma sequência de bytes que são produzidos / consumidos a uma taxa geralmente determinada por dados dentro do fluxo. Por exemplo, um fluxo de dados MPEG terá cabeçalhos de quadro que descrevem o que a próxima sequência de bytes faz e quantos precisam ser consumidos. A serialização binária de um documento seria semelhante. Nem sempre é autoexplicativo: a gravação no STDOUT pode ser feita de maneira otimizada para fluxo, mas pode ser dados humanamente legíveis / não analisáveis.

Por outro lado, uma fila geralmente é de um tipo bem conhecido de objeto (ou objetos de suporte a interface) que são consumidos por inteiro. Um exemplo pode ser uma fila de trabalhos de banco de dados que são processados ​​por vários trabalhadores de banco de dados.


5

Uma diferença entre um fluxo e uma fila é a maneira como a taxa de dados é controlada:

  • em uma fila, o remetente se adapta à velocidade do leitor. O remetente decide o que fazer se a fila estiver cheia: aguarde a disponibilidade da fila ou jogue dados fora.

  • em um fluxo, o leitor se adapta à velocidade do remetente. O leitor decide o que fazer se novos dados chegarem antes que os antigos sejam consumidos.

Com essa perspectiva, fluxos de caracteres, como pipes Unix, não se qualificariam como fluxos, mas como filas.


No streaming de vídeo adaptável, o servidor se ajustará a um fluxo de fidelidade mais baixo porque o cliente não está acompanhando.
JBRWilkinson

@JBRWilkinson - No streaming de vídeo adaptável , o servidor envia apenas várias variantes de um stream em diferentes taxas de bits. Ainda é responsabilidade do cliente escolher entre esses fluxos.
Mouviciel 24/05

Sim, o streaming HTTP faz isso. Eu quis dizer chamadas de vídeo que são ponto a ponto e os dados não são pré-codificados. Meu mal - eu deveria ter sido explícito.
JBRWilkinson

A intenção de um fluxo de caracteres é que os dados sejam consumidos mais ou menos à medida que são produzidos: é um fluxo de dados e não um meio de armazená-los. Sabemos que isso não é perfeito na prática, mas do ponto de vista metafórico é esperado para ser verdade: o leitor pode processar o fluxo tão rápido como ele entra.

5

Se pensarmos mais visualmente sobre como as palavras são comumente usadas , podemos evitar a confusão de usos específicos por linguagens e implementações específicas, para que esses termos possam realmente significar algo:

  • Uma fila de pessoas espera na fila e é atendida uma a uma. Mais pessoas entram na fila no final. Todo mundo espera enquanto o serviço prossegue e o tempo de serviço deve variar. Você pode falar de quantas pessoas são atendidas no total.
  • Um fluxo de pessoas, por exemplo, deixando um prédio por uma porta, não é atendido um a um, apenas passa pelo ponto de saída a uma taxa mais ou menos constante. Atrasos não são esperados e não são bem tolerados. Você pode falar de uma taxa de pessoas: uma por segundo.

Essa é a intenção desses termos. São metáforas. (como todo o resto) (Shhh! você vai estragar a história!)


2

Uma fila é um conceito de nível superior ao de um fluxo. Os elementos base de uma fila são uma mensagem / objeto, que é uma estrutura de dados coerente (geralmente digitada) que pode ser interpretada pelo consumidor por conta própria. Por outro lado, na base de um fluxo , há (geralmente tamanho fixo) bits / bytes / caracteres, que, por si só, geralmente não fazem sentido para o aplicativo. Uma sequência desses caracteres pode compor uma "mensagem", mas uma API de fluxo deixa para o aplicativo dividir a sequência de caracteres em partes sensíveis.

Uma API de fluxo geralmente também permite leituras e gravações parciais, se os buffers de fluxo estiverem cheios e o outro lado não estiver lendo / gravando; aplicativos que manipulam filas geralmente esperam que a fila os manipule internamente.

Uma fila pode ser implementada no topo de um fluxo, isso é feito implementando o enquadramento da mensagem. Por exemplo, o TCP fornece uma interface de fluxo, o HTTP é construído sobre o TCP e adiciona o enquadramento da mensagem usando a codificação de transferência Conteúdo-Comprimento / transferência em pedaços. Os usuários de uma API de conexão HTTP são impedidos de lidar com a divisão do fluxo de conexão HTTP em solicitações HTTP.

Por outro lado, geralmente, faz menos sentido implementar uma API de fluxo no topo de uma fila, pois o tratamento do enquadramento de mensagens adiciona uma sobrecarga desnecessária.


Vale acrescentar que a API da fila geralmente produz / consome um único elemento de cada vez, enquanto a API de streaming geralmente produz / consome várias "palavras" de cada vez. Embora eu concorde, que a característica definidora é que uma fila seja de alto nível e estruturada, enquanto um fluxo é de baixo nível e sem estrutura.
27518 Alexey

0

Nas linguagens de programação funcional (por exemplo, Scala), e talvez em outras linguagens, os fluxos são realmente mais como listas funcionais e são filas. Devo observar, no entanto, as filas podem realmente ser implementadas usando um par de listas . Em Scala e provavelmente em outros lugares, um Stream é apenas uma lista lenta - mais especificamente, o final da lista é a lazy val.

Os fluxos funcionais podem compartilhar alguma semelhança com as filas, ao contrário de listas, pois você pode usá-los de maneira a não manter uma referência ao cabeçalho do fluxo - mas você deve ter cuidado: https: // stackoverflow.com/a/5159356/3096687 . Isso é um pouco análogo a uma chamada de desenfileiramento para uma fila (embora, no caso de um fluxo, você o faça implicitamente: http://daily-scala.blogspot.com/2010/01/streams-2-stream-construction.html )


-1

Stream é um conceito / estrutura para produzir e consumir uma infinita sequência de dados em série ou em paralelo ou em massa. Que é uma estrutura de dados através da qual o fluxo pode ser implementado. assim como list ou seq através do qual o fluxo pode ser implementado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.