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?
data-structures
elliot42
fonte
fonte
Respostas:
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.
fonte
yes(1)
é a string padrão incorporada. Executar com um argumento, é o que forneceu o argumento.(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.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
Seek
operação, principalmente se você estiver lendo.fonte
FileStream
pode ser aberto noReadWrite
modoNa 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.
fonte
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.
fonte
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:
Essa é a intenção desses termos. São metáforas. (como todo o resto) (Shhh! você vai estragar a história!)
fonte
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.
fonte
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 )
fonte
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.
fonte