首页

来自智得网
跳转至: 导航、​ 搜索

精选文章

Channel【Golang】查看全文
Channel结构体.png
“不要通过共享内存来通信,通过通信来共享内存”,——rob pike

对于程序而言,不同线程/进程之间的数据共享模式大致可以分为两类 通过共享内存的方式实现,本质上就是多线程模式,大多数面向过程或者面向对象的语言一般都采用该方式,共享内存即不同线程访问同一个变量,每个线程可以看到其他线程对变量的变更,共享内存方式存在以下缺点: 变量的更新操作需要同步机制,在性能方面,实现复杂度方面较高。 变量的更新需要对其他线程立即可见,需要额外的保障机制。 变量变更的追踪机制复杂,业务逻辑较为复杂。 通过通信来共享数据,通用的模式有Actor和CSP两种模式,Actor模型中,主角是Actor,Actor一般是协程机制的worker,Actor彼此之间直接发送消息,不需要经过间介质,消息是异步发送和处理的,CSP机制的worker没有Actor自带的信箱机制,需要通过管道(Channel)通信,通过channel,CSP机制的worker之间耦合性更低。 Channel的通信模式,数据通过消息进行交互,数据发送之后不再和其他线程共享,不需要复杂的同步机制。 Channel天然实现了异步通信机制,性能更高。 Golang语言中的Channel是协程(Goroutine)之间通信的管道,用于协程之间通讯和同步。 Channel用于交换Goroutine之间的数据,缓冲模式的Channel是异步模式的,所以需要有数据的存储组件,该存储组件是采用环形队列实现的。

对Channel的写操作可能因为存储空间已满的原因发生阻塞,同理读操作可能会因为数据为空而发生阻塞,需要保存这些阻塞的Goroutine,Channel使用双向链表分别保存读写发生阻塞的Goroutine…
Flink查看全文
Flink的logo.jpg
Flink是一个分布式的流处理开源框架,其前身是柏林理工大学的内部研究性项目, 2014 Flink 纳入 Apache 孵化器,现是 Apache 基金会的顶级项目之一。

Fink 框架由 Java 语言进行开发。 Flink可以高效处理批处理任务以及流式处理任务,批流一体是Flink数据处理的理念之一,批处理作为流处理的特例进行处理。 Flink的主要特点如下: Flink是一个大规模分布式系统; Flink可以处理乱序数据,在乱序场景下保证结果的正确性; Flink保存状态,可以保证确保仅一次处理(exactly-once); Flink处理流式数据延时较低,吞吐量大。 Flink架构中,Flink的结点分为JobManager和TaskManager。 名词解释 执行流程 Flink的一个任务可以用Dataflow进行描述,Dataflow有一个或者多个的输入数据流(Source),有一个或者多个的输出结果(Sink)。Dataflow处理过程中的操作称算子(operator)。 Flink任务最终通过Flink程序执行,所有的Flink程序都是由Source 、Transformation 和 Sink组成。 Source 负责数据源的读取,所有的Flink程序都会以一个或多个sources开始。 Transformation 利用各种算子进行处理加工,多数情况下,程序中的转换运算(transformations)跟dataflow中的算子 (operator)是一一对应的关系。

Sink 负责Flink程序的输出。
GMP查看全文
Golang的GMP模型.png
GMP是Golang语言协程调度机制的模型。

协程机制是对传统的多线程/进程机制的一种改良,虽然多进程/线程可以有效提升系统的并发能力,但是互联网等高并发场景下,需要并发处理的请求量级较大,每个请求创建一个线程会带来大量的内存等资源的消耗。 而且进程/线程切换的成本较高,对CPU产生了较大的浪费。 golang的语言的协程机制通过实现用户态线程(协程)的方式减少线程的资源消耗以及切换消耗,用户态线程在执行的时候动态绑定到系统线程上。 无论是多线程、多进程、多协程都涉及到多个任务的并发执行,而且任务数量往往多于CPU的核数,所以就有了任务调度的需求,当进程阻塞在IO、时间占用较长等场景下需要切换其他等待执行的进程。 在早期单进程时代是不需要调度器的,因为进程是串行执行的。 GMP是协程的调度机制,G代表的是go语言中的协程,M代表的是实际的线程,P代表的是Go的逻辑处理器。 协程通过调度器和系统线程进行绑定之后,才能真正执行代码逻辑,协程和线程的绑定关系可以分为1 : 1,N:1,M:N等几种模型。在Golang语言中G和P是多对一的关系,而P和M是一对一的关系。 G和P,以及P和M之间的关联关系不是固定的,例如P在运行过程中被销毁,之前绑定的G就会转移到其他的P上执行。 数据存储 调度机制意味着不是所有的任务都可以得到立即执行,而不能被执行包括被切换的协程需要有存储的机制。等待被调度执行的协程存储在运行队列,Golang的调度器把队列分为局部运行队列和全局运行队列,每个和P绑定一个长度为256的循环队列,每次把G放入该队列的时候从末尾插入,获取的时候从头部获取。

除了从本地队列获取执行线程外,P还有一个特殊的字段runnext可以标识下一个要执行的协程…

热门分类

算法题库

精选内容