串流处理是一种计算机编程范式,相当于数据流编程,事件流处理,和反应式编程,其允许一些应用更容易地利用了有限形式的并行处理。
串流处理是一种计算机编程范式,相当于数据流编程,事件流处理,和反应式编程,其允许一些应用更容易地利用了有限形式的并行处理。这些应用程序可以使用多个计算单元,例如图形处理上的浮点运算器或现场可编程门阵列(FPGAs),而无需明确管理这些单元之间的分配,同步或通信。
简介
串流处理是针对数据流应用大规模密集型计算特点和多核处理器而设计的一种编程模型。串流处理范例是通过限制可执行的并行计算来简化并行软件和硬件。给定一个数据序列(串流处理),一系列操作(内核函数)被应用到串流中的每个元素。例如:直播软件。内核函数通常使用流水线(计算),并且尝试优化本地片上内存重用,以便最大限度地减少带宽损失,并通过外部存储器交互。典型的是统一串流式传输,其中一个内核函数应用于流中的所有元素。由于内核和流抽象展现了数据依赖性,编译器工具可以完全自动化和优化片上管理任务。串流处理硬件可以使用记分板例如,当依赖关系变得已知时启动直接内存存取(DMA)。手动 DMA 管理的取消减少了软件的复杂性,并且相关的硬件缓存 I / O 消除,减少了专用计算单元(例如算术逻辑单元)必须涉及服务的数据区域扩展。在 20 世纪 80 年代,串流处理在数据流编程中得到了探索。一个例子是语言 SISAL(单一赋值语言中的流和迭代)。
事件流处理
数据流(事件流),在通信领域中它常用来表示一连串的数字编码序列,但是,在实际应用中它用来表示某一设备所产生的连续事件信息。它代表了一种新的数据模式,与传统数据库模型不同,它是一种大量、连续、快速、随时间变化的数据流。这类事件流包含两个方面的特征:一是事件信息是连续不断的产生,在早期,这类数据一般在股票交易系统中出现的比较多,但是银行、互联网监控等领域也会产生大量持续的数据;二是需要实时的对更新的数据流进行分析(如趋势分析、预测等),提取有用的信息。
事件流处理要求系统能够实时准确的分析流事件,并将符合业务逻辑的事件告诉给事件监听器。同时与此功能大致相同的还有一个相关的概念叫复杂事件处理。使用模式比对、事件的相互关系、事件间的聚合关系,其目的是从事件云中找出有意义的事件,使得架构可以更能弹性使用事件驱动架构,并且能使企业更能快速的开发出更复杂的逻辑’架构。复杂事件处理可以看作是一种处理串流的数据库处理。在关系数据库中数据是由许多行组成的数据表,复杂事件流处理将事件串流看作是数据表来处理,每个事件的属性相当于数据表中的字段。
响应式编程
在计算机中,响应式编程或反应式编程(Reactive programming)是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。
电子表格程序就是响应式编程的一个例子。单元格可以包含字面值或类似"=B1+C1"的公式,而包含公式的单元格的值会依据其他单元格的值的变化而变化 。
另一个例子是硬件描述语言,比如 Verilog,这里响应式编程可以对电路中传播的信号变化进行建模。响应式编程最初是为了简化交互式用户界面的创建和实时系统动画的绘制而提出来的一种方法,但它本质上是一种通用的编程范式。例如,在 MVC 软件架构中,响应式编程允许将相关模型的变化自动反映到视图上,反之亦然。
响应式编程语言包括从显式的使用箭头来表示数据流,到隐式的通过语言类似命令式或者函数式的语言架构派生而来的数据流。例如,在隐式的函数式响应式编程中,一个函数调用可能隐式的导致一个节点在数据流图中被创建出来。动态语言的响应式编程库(例如 Lisp 的“Cells”和 Python 的“Trellis”等)可以在运行时通过对函数执行数值读取的过程进行分析,构建出依赖图,使得数据流不仅隐式,而且动态。响应式编程的说法有时候会被用在软件工程的架构分层中,这是数据流图中所谓的节点只是能够互相通信的普通程序。
并行处理
并行处理(Parallel Processing)是计算机系统中能同时执行两个或更多个处理的一种计算方法。并行处理可同时工作于同一程序的不同方面。并行处理的主要目的是节省大型和复杂问题的解决时间。为使用并行处理,首先需要对程序进行并行化处理,也就是说将工作各部分分配到不同处理进程(线程)中。并行处理由于存在相互关联的问题,因此不能自动实现。另外,并行也不能保证加速。从理论上讲,在 n 个并行处理的执行速度可能会是在单一处理机上执行的速度的 n 倍。