流和队列有什么区别?


13

流和队列有什么区别?它们都具有元素的有序集合的概念,但是倾向于具有不同的实现和“插入” /“提取”(流)与“入队” /“出队”(队列)的词汇表。这些可以互换吗?他们提出不同的概念或模式吗?如果是这样,有什么区别?


显然,“流”是指在不同上下文中的不同事物。字符流与COM中的 Windows IStream接口与体系结构中的事件流之间的特性有所不同。你能澄清一下吗?
rwong

wood夫从溪流中收集一些水,但是他们并没有消耗掉所有的水。因此,有一种感觉是从流中收集量而不完全消耗它。另一方面,队列中的项目可能已用尽。
emallove18年

Answers:


11

是不是一个真正的数据结构,这样(在概念上),但是数字编码相干信号用于发送或接收信息”(数据或数据包的数据包)的序列。因此,基本上数据的序列。

一个队列是一个简单的FIFO机制,允许您将项目添加到队列的后面或前面走。

流始终具有源,例如文件,网络位置等。队列本身并不包含任何数据。

因此,本质上它们在概念上是完全不同的,并且正如梅森指出的那样,它们的用法也有所不同。


实际上存在一个称为“流”的数据结构,(有效)要使用的数据列表,其尾部带有生产者函数,如果需要更多元素,则可以调用该函数。
瓦汀

Unix的“是”命令看起来像流,但是没有特定的数据源。
JBR威尔金森

@JBRWilkinson:不带参数运行,其数据源为yes(1)嵌入式默认字符串。带参数运行,无论提供参数如何。
Blrfl 2013年

是的,您是对的-所有数据都必须来自某个地方。也许这里的实际意义是,队列可能为空,而根据定义,流通常不是?
JBR威尔金森

2
@JBRWilkinson事实并非如此。在Scheme中,(stream)返回一个空流。另外,此答案是错误的,流是数据结构,流可能没有源,流本身不包含任何数据,它们可能为nil或null或空列表。有关更多信息,请参见SRFI-41
保姆2015年

5

基本区别在于它们的使用方式。在流中,通常只使用操作的一侧:打开流以读取或写入,但不能同时读取和写入。而在排队的情况下,您需要将物品放进去然后取出。

另外,队列对您放东西的顺序非常严格,而流通常(但不总是)支持Seek操作,尤其是从它们中读取时。


3
FileStream可以在ReadWrite模式下打开。
罗伯特·哈维

2
..和优先级队列提供有关顺序的选项
Petter Nordlander

5

以我的经验,流是按通常由流中数据确定的速率产生/消耗的字节序列。例如,MPEG数据流将具有帧标头,这些标头描述了下一个字节序列的功能以及需要消耗的字节数。文档的二进制序列化将是相似的。它并不总是自描述的:可以以流方式完成对STDOUT的写入,但是它可能是人类可读/不可解析的数据。

相反,队列通常是众所周知类型的对象(或支持接口的对象),它们全部被消耗掉。一个示例可能是由许多数据库工作人员处理的数据库作业队列。


5

流和队列之间的区别在于控制数据速率的方式:

  • 在队列中,发件人适应阅读器的速度。发件人决定如果队列已满怎么办:等待队列可用或丢弃数据。

  • 在流中,读取器适应发送者的速度,读取器决定如果新数据在旧数据被消耗之前到达时该怎么办。

从这个角度来看,诸如Unix管道之类的字符流将不被视为流,而是被视为队列。


在自适应视频流中,服务器将调整为较低保真度的流,因为客户端没有跟上。
JBR威尔金森

@JBRWilkinson-在自适应视频流中,服务器只是以不同的比特率发送流的多个变体。客户仍然有责任在这些流中进行选择。
mouviciel

是的,HTTP流可以做到这一点。我的意思是视频通话是点对点的,数据没有经过预编码。我的坏-我应该明确。
JBR威尔金森

字符流的目的是在生成数据时或多或少地消耗数据:它是数据流,而不是保存数据的手段。我们知道,这是不完美的实践中,但是从隐喻的角度来看,预计是正确的:尽可能快进来读者可以处理的数据流。

5

如果我们更直观地思考这些单词的常用用法,我们可以避免特定语言和实现方式对特定用法的混乱,因此这些术语实际上可以表示以下含义:

  • 一个队列排队等待的人,并通过一个服务之一。更多的人排在后面。每个人都在等待服务的进行,服务时间可能会有所不同。您可以说总共服务了多少人。
  • 一个的人离开建筑物穿过一道门,例如,不是由一个服务的一个,他们只是通过出口点在更多或更少的稳定率。延迟是无法预料的,​​并且不能很好容忍。您可以说是一种速度:每秒一人。

这是这些术语的意图。他们是隐喻。(就像其他所有内容一样)(嘘!您会毁了这个故事!)


2

队列是比流更高层次的概念。队列的基本元素是消息/对象,它是一个连贯的(通常是类型化的)数据结构,可由消费者自行解释。另一方面,在的基础上,存在(通常是固定大小的)位/字节/字符,它们本身对应用程序通常毫无意义。这些字符序列可以组成一个“消息”,但是流API将其留给应用程序以将字符序列拆分为有意义的块。

如果流缓冲区已满,而另一端未进行读/写,则Stream API通常还允许部分读写。处理队列的应用程序通常希望队列在内部进行处理。

队列可以在流的顶部实现,这是通过实现消息框架来实现的。例如,TCP提供了一个流接口,HTTP建立在TCP之上,并使用Content-Length / chunked传输编码添加了消息帧。HTTP连接API的用户从处理HTTP连接流拆分为HTTP请求的过程中抽象出来。

另一方面,通常,在队列顶部实现流API的意义较小,因为对消息帧的处理会增加不必要的开销。


值得补充的是,队列API通常一次生成/使用一个元素,而流媒体API通常一次生成/使用多个“单词”。尽管我同意,但定义的特征是队列高层次结构化,而流是低层次结构化。
阿列克谢

0

在函数式编程语言(例如Scala)以及其他语言中,流实际上更像是函数列表,它们是队列。但是,我应该注意,实际上可以使用一对list实现队列。在Scala以及其他地方,Stream只是一个惰性列表-更具体地说,列表的尾部是一个lazy val

功能流可以与队列(而不是列表)共享某些相似之处,因为您可以以不保留对流头的引用的方式使用它们-但您必须小心:https:// stackoverflow.com/a/5159356/3096687。这有点类似于队列的出队调用(尽管在流的情况下,您还是隐式地这样做:http : //daily-scala.blogspot.com/2010/01/streams-2-stream-construction.html)。


-1

流是一种概念/框架,用于产生和使用串行,并行或大量数据的无限序列。Que是可通过其实现流的数据结构。就像可以实现流的list或seq一样。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.