七周七并发模式:Lambda架构

Lambda架构

定义

Lambda架构使用了可以进行大规模数据批处理的MapReduce技术,也使用了可以快速处理数据并及时反馈的流处理技术,这样的混搭能够为大数据问题提供扩展性、响应性和容错性都很优秀的解决方案。

七周七并发模式:通信顺序进程(CSP)

概念

CSP

与actor模型类似,通信顺序进程(Communicating Sequential Processe,CSP)模型也是由独立的、并发执行的实体所组成,实体之间也是通过发送消息进行通信。但两种模型的重要差别是:CSP模型不关注发送消息的实体,而是关注发送消息时使用的channel(通道)。channel是第一类对象,它不像进程那样与信箱是紧耦合的,而是可以单独创建和读写,并在进程之间传递。

  • 从这段话可以看出CSP本质上也是独立运行的执行单元,但是它没有mailbox,那么它执行的数据来自哪里呢?来自于channel。

七周七并发模式:Actor

什么是Actor

  • 在本书提到的观点中,认为Actor是一个线程或者进程。在这个线程或者进程中执行了一段代码(函数),这个代码可以包含状态(数据)也可以不包含。

所谓Actor模型是Sequential Processes和Functions transforming data values两者的结合,可以理解为是综合了过程式计算和函数式计算的一个计算模型。

一个Actor会把接收到的消息映射为三个部分,传给其他Actor的消息,一个新的行为(用来处理下一个消息),和创造一些新的Actors。

七周七并发模型:函数式编程

概念

  • 命令式编程的代码由一系列改变全局状态的语句构成,而函数式编程则是将计算过程抽象成表达式求值。
  • 这些表达式由纯数学函数构成,而这些数学函数是第一类对象(我们可以像操作数值一样操作第一类对象)并且没有副作用。由于没有副作用,函数式编程可以更容易做到线程安全,因此特别适合于并发编程。

为什么在并发和并行问题时会用到函数式编程

  • 有关锁的一些规则,都是针对于线程之间共享的可变的数据——换个说法就是共享可变状态。而对于不变的数据,多线程不使用锁就可以安全地进行访问。
  • 这就是为什么在解决并发和并行问题时函数式编程会如此引人注目——它没有可变状态,所以不会遇到由共享可变状态带来的种种问题。
  • 纯粹的函数式语言中,函数都具有引用透明性——在任何调用函数的地方,都可以用函数运行的结果来替换函数的调用,而不会对程序产生副作用。这个特性也使得可以任意安排多个计算过程的求值顺序,包括让它们并行
  • 所有函数(至少是理论上)都可以同时执行。这种执行方式被称为数据流式编程(dataflow programming)。
  • PS:其实本书在第三章函数式编程部分的前两天中的内容,在我看来更多的是利用语言或者运行时本书的并发能力。后续会专门写个文章总结下C#中对应的并发功能。

七周七并发模型:线程与锁

为何使用多线程和锁

  • 为了能够并行的计算一些东西
  • 因为在多线程下,如果要修改同一个对象是值会出现竞态条件(即代码行为取决于各操作的时序)。它的表现可能是值的不对,甚至某些时候这个值的前半段是一个线程修改的,后半段是另一个线程修改的。因为这个对象可能不是原子的。

锁,或者说是并行控制的进化

第一阶段:锁与同步方法

基础的锁

  • 从代码层面看就是一个lock函数

同步方法

  • 在java或者C#中可以通过attribute来让方法同步执行,但是这个的效率是很低的。
  • 同时还引出了另外一个问题,当同时使用多个锁的时候不但效率会进一步降低,而且容易产生死锁。
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×