`
春花秋月何时了
  • 浏览: 42450 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

并发编程模型

 
阅读更多

并发模型设定了系统中的并发线程如何协作完成被分配的任务。不同的并发模型存在不同的业务拆分与线程协作方式。

 

一 并行工作者模型


 
在并行工作者模型中,委派者(Delegator)将作业分派给不同的工作者,每个工作者独立完成整个任务作业。工作者大多是以多线程的方式并行运行。

1.1 并行工作者模型的优点

简单易懂,往往只需要增加工作者来提高系统并行处理能力。例如:网络爬虫系统。

1.2 并行工作者模型的缺点

1)共享状态可能会很复杂。 

并行工作者模型可能需要访问共享数据,这些共享数据可能在内存中或者数据库中,涉及到对共享数据的存取时,往往需要进行加锁,从而使线程出现竟态死锁以及很多其他共享状态的并发性问题。同时,在执行需要访问共享数据结构部分的代码时,高竞争基本上会导致执行时出现一定程度的串行化。

2)无状态的工作者

如果共享数据能够被系统中得其他线程修改,那么所有工作者在每次使用共享数据之前都需要重新读取。不论这些共享数据是存在于内存中还是数据库中,工作者都无法在内部保存这个状态称为无状态的工作者,每次都重新读取,特别是这些共享数据存储在外部数据库中的时候,将会导致性能下降。

3)任务顺序是不确定的

由于每一个线程独立完成整个任务,所以作业执行顺序是不确定的。无法保证哪个作业最先或者最后被执行,使得很难在任何特定的时间点推断系统的状态,这也使得它也更难保证一个作业在其他作业之前被执行。

 

二 流水线工作模式(反应器、事件驱动模型)

在流水线工作模型中,每个工作者只负责作业中的部分工作,当完成了自己的这部分工作时工作者会将作业转发给下一个工作者。


在有时候作业甚至也有可能被转发到超过一个工作者上并发处理。比如说,作业有可能被同时转发到作业执行器和作业日志器。

流水线模型的channels 模型是比较灵活一种模型,其工作者之间不直接进行通信。他们只在不同的通道上发布自己的事件,而不需知道下一个工作者,其他工作者可以在这些通道上订阅或者取消订阅,从而实现对流水线作业的下一步处理,这使得工作者之间具有松散的耦合。

2.1 流水线模型的优点 ---- 对应了并行工作者模型的缺点

1)无需共享的状态

因为流水线工作者都是在自己的线程中运行,并且不会和其他工作者共享状态,这就好像是单线程在处理工作,也就没有了并行工作者出现的共享状态的复杂性。

2)有状态的工作者

由于没有共享状态的维护,所以工作者可以在运行时保存自己需要的数据在内存中(由于现代CPU多核的设计,CPU缓存的存在将大大提升这种状态的存取),变成有状态的,只需在最后将更改写回到外部存储系统,这将有效的提升性能。

3)合理的作业顺序
 
基于流水线并发模型实现的并发系统,在某种程度上是有可能保证作业的顺序的。作业的有序性使得它更容易地推出系统在某个特定时间点的状态。更进一步,你可以将所有到达的作业写入到日志中去。一旦这个系统的某一部分挂掉了,该日志就可以用来重头开始重建系统当时的状态。按照特定的顺序将作业写入日 志,并按这个顺序作为有保障的作业顺序.

2.2 流水线模型的缺点

流水线并发模型最大的缺点是作业的完整执行被分布到多个工作者上,而基于事件的驱动又往往采用回调的方式进行处理。这不仅加大了代码的编写阅读难度,并且难以进行追踪和确保在回调过程中只访问他需要的数据,即所谓的回调地狱

 

3 函数式并行(Functional Parallelism)

 

在面向对象思想产生之前,函数式编程已经有了数十年的历史, 但是更多地都是在大学中,在实验室中应用,而很少真的应用到真实的生产环境。由于面向对象的多核并行程序对共享数据的处理需要付出很大的代价,函数式编程就被推到了前线,无论是冷门的Haskell,Erlang,还是Scala,F#,都是函数式编程成功的典型。Java7中的java.util.concurrent包里包含的ForkAndJoinPool以及Java8中并行streams都对函数式编程的实现有帮助。

 

在函数式编程中,函数是基本单位,他几乎被用作一切,包括最简单的计算,甚至连变量都被计算所取代。在函数式编程中,变量只是一个名称,而不是一个存储单元,这是函数式编程与传统的命令式编程最典型的不同之处。

 

函数式编程是无状态的。函数式编程没有循环而是递归,因为循环是在描述我们该如何地去解决问题,这也意味着存在状态的保存,而递归是在描述这个问题的定义。

 

在传统的命令式编程中,变量/对象被作为状态的存储单元,而在函数式编程中,变量是不变的,他的状态是保存在函数的参数中,作为函数的附属品,函数调用通过尾递归的方式解决无状态的问题。尾递归就是不要保持当前递归函数的状态,而把需要保持的东西全部用参数给传到下一个函数里,这样就可以自动清空本次调用的栈空间,这样一来也就不用担心栈空间内存溢出的问题了。

 

总体地说,其实函数式编程最适合地还是解决局部性的数学小问题,要让函数式编程来做CRUD,来做我们传统的逻辑性很强的Web编程,就有些免为其难了。

就像如果要用scala完全取代今天的Java的工作,我想恐怕效果会很糟糕。而让Scala来负责底层服务的编写,恐怕再合适不过了。

 

  • 大小: 24.1 KB
  • 大小: 11 KB
  • 大小: 13.9 KB
  • 大小: 12.6 KB
分享到:
评论

相关推荐

    并发编程模型演进

    ### 并发编程模型演进——协程篇 #### 一、并发编程概述 随着计算机硬件的发展和软件需求的增长,并发编程技术变得越来越重要。并发编程是指在一个程序中同时执行多个计算任务的能力,它可以显著提高程序的运行...

    新型并发编程模型.pptx

    ### 新型并发编程模型知识点详解 #### 一、并发编程模型概述 1. **定义与分类**: - **定义**:并发编程模型是指在计算机系统中,同一时间段内能够处理多个任务或请求的能力。 - **分类**: - **按任务调度方式...

    并发编程模型与理论.pptx

    根据提供的文件信息,我们可以深入探讨并发编程模型与理论的关键知识点。 ### 并发编程定义与重要性 #### 定义 并发编程是指在一个系统中同时处理多个任务或事件的能力。这种编程模式能够充分利用多核处理器的优势...

    量子计算中的并发编程模型.pptx

    ### 量子计算中的并发编程模型 #### 一、量子并发编程模型的类型 量子计算作为一种新兴的计算范式,利用量子力学原理来进行信息处理。在量子计算领域中,并发编程模型是实现高效量子算法的关键技术之一。下面我们...

    GO语言全套教程+基础语法+并发编程模型+微服务架构等

    Go并发编程模型.pdf Go网络编程实践.pdf Go数据库交互技术.pdf Go语言构建Web应用.pdf Go语言与微服务架构.pdf Go语言性能优化.pdf Go语言错误处理与测试.pdf Go语言反射与接口.pdf Go语言标准库深度解析.pdf Go语言...

    并发编程模型.xmind

    JVM思维导图 包含线程通信和线程同步相关内容,主要是java 并发模型的一个总结

    Go语言基础语法+Go语言进阶特性+Go并发编程模型+Go网络编程实践+Go数据库交互技术+Go语言构建Web应用等全套教程

    Go并发编程模型 Go网络编程实践 Go数据库交互技术 Go语言构建Web应用 Go语言与微服务架构 Go语言性能优化 Go语言错误处理与测试 Go语言反射与接口 Go语言标准库深度解析 Go语言工具链使用 Go语言项目实战 Go语言社区...

    iOS并发编程指南.pdf

    在iOS开发中,传统的并发编程模型依赖于线程的使用,但是这种模型在扩展性和线程管理方面存在局限性。随着并发编程需求的不断增长,iOS和Mac OS采用了一种异步设计方式来解决并发问题。这种方式不仅让应用程序能够更...

    深入探索Clojure并发编程:从原子操作到软件事务内存

    Clojure,作为一种现代的Lisp方言,运行在JVM上,提供了强大的并发编程模型。本文将详细介绍Clojure中的并发编程工具,包括原子操作、代理、软件事务内存(STM)等,并提供实际的代码示例。 Clojure的并发编程模型为...

    Java虚拟机并发编程.英文完整版.pdf

    #### 二、Java虚拟机(JVM)上的并发编程模型 - **JVM并发编程基础**:介绍了JVM如何支持并发执行,包括线程调度、同步机制等基本概念。 - **Java并发API**: - **`java.util.concurrent`包**:提供了一系列高级并发...

    IOS并发编程指南

    该文档着重解释了在iOS平台,开发者如何通过利用Apple提供的并发编程模型,包括Grand Central Dispatch (GCD) 和 Operation Queues,来解决并发问题,同时避免了传统多线程编程模式中存在的伸缩性和复杂性问题。...

    java并发编程实战源码,java并发编程实战pdf,Java

    《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...

    ios 并发编程指南

    iOS多线程 并发编程指南 iOS 和 Mac OS 传统的并发编程模型是线程,不过线程模型伸缩性 不强,而且编写正确的线程代码也不容易。Mac OS 和 iOS 采取“异步 设计方式”来解决并发的问题。

    Java 并发编程实战.pdf

    书中会首先介绍Java并发编程的基础知识,包括线程的创建和运行,同步机制的基本用法,以及Java内存模型的相关概念。随着章节的深入,作者可能会更深入地讲解Java提供的并发工具,例如锁、原子变量、线程池、以及并发...

    java并发编程从入门到精通

    Java作为一门广泛使用的编程语言,其并发编程模型更是受到了众多开发者的关注。 首先,了解并发编程的基础知识是至关重要的。并发编程涉及的面很广,包括但不限于进程与线程的概念、线程的创建和管理、线程间的通信...

    并发编程-事件驱动模型1

    事件驱动模型是一种常见的并发编程模型,尤其适用于网络服务器和用户界面(UI)应用程序。 1、**传统的编程模式** 在传统的编程模式中,程序按照预定的顺序执行,从开始到结束,每个代码块按照既定的流程依次执行。...

    iOS 并发编程

    开发者应当学会如何使用GCD和Operation Queues来替代传统的线程创建和管理,以及如何将现有的基于锁的代码和循环代码迁移到新的并发编程模型中。 在iOS并发编程的学习过程中,初学者除了要掌握上述基础知识点之外,...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段26讲、多线程下的生产者消费者模型,以及详细介绍notifyAll方法.mp4 │ 高并发编程第一阶段27讲、wait和sleep的本质区别是什么,深入分析(面试常见问题).mp4 │ 高并发编程第一阶段28讲、...

Global site tag (gtag.js) - Google Analytics