`
xiuzhuchenqing
  • 浏览: 16183 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Clojure与并行计算

 
阅读更多

我们在写Java代码时对于处理并行计算总是需要特加小心,加锁与否是个相当伤脑筋的事。Clojure对并行计算支持的很好,这也成为很多业内人员选择使用Clojure的一个重要原因。

 

维基百科中有一段文字很好的阐述了并行计算的概念:“系统中能够同时执行多个计算,并且存在潜在的彼此交互,这种特性被称为并行。并行计算可能在同一芯片的多个核上执行,那些时分线程优先运行在同一处理器上,或执行在物体空间彼此独立的处理器上。并发的主要挑战是如何管理好对共享而又易变状态的访问。

 

管理并封锁比较有困难。因为需要决定哪些对象需要锁定,以及何时锁定。当代码发生更新或者新的代码加入时,这些决定需要重新评估。如果一个开发人员忘记了给需要锁定的对象上锁或者上锁的时间点错误,会导致糟糕的事情发生。这些包括死锁和条件竞争。如果对象不需要上锁且给锁定了会带来性能上的损耗。

 

Clojure中所有的数据都是非易变的,除非用相应的VarRefAtomAgent类型明确表示某数据是易变的。这提供了管理共享状态的安全机制。

在一个新的新线程中运行任何Clojure函数都是小菜一碟,包括用户自定义的显示或者匿名函数。更多和Java交互的细节内容可以参考Java Interoperability

 

因为Clojure能够使用所有的Java类和接口,所以它能够充分利用Java的并发能力。"Java Concurrency In Practice"是一本非常不错的专门讨论Java并发性的书籍。该书就如何使用Java管理并发性提出了相当不错的建议,但是想要按照建议去做并非易事。大多数场合下,使用Clojure的引用类型要比基于Java的并发容易得多。

 

除了引用类型外,Clojure提供了多个函数用于辅助在不同的线程中运行代码。

 

future宏主体中的表达式执行在线程池(CachedThreadPoolAgents也享用这些线程)的某个线程上。这非常有利于执行那些需要长时间运行但又不必立即返回值的表达式。其结果通过对future宏的返回值对象进行解析得到。假如值被请求时,宏体还没有执行完毕,当前的线程将阻塞直到完毕为止。由于某个Agent线程池中的某线程处于被用状态,应该在某处调用shutdown-agents以终止这些线程,使得应用程序能够顺利退出。

 

为了阐述future的使用,下面的示例特意加了打印函数println,帮助理解函数如何运行,如下(注意输出内容的顺序):

(println "creating future")
(def my-future (future (f-prime 2))) ; f-prime is called in another thread
(println "created future")
(println "result is" @my-future)
(shutdown-agents)
 

输出如下:

creating future
created future
derivative entered
result is 9.0

 

pmap函数将一个函数并行地应用在集合的所有项上。当函数应用在各个项上的函数的消耗时间比管理线程所消耗的时间要多时,它提供了比map函数更好的性能。

 

Clojure.parallel名字空间提供了更多用于处理并行代码的辅助函数。包括 parpdistinctpfilter-dupespfilter-nilspmaxpminpreducepsortpsummary pvec.

 

分享到:
评论

相关推荐

    Clojure编程乐趣]+clojure_programming.pdf

    Clojure与Java紧密集成,可以直接调用Java库,这使得Clojure可以利用Java生态系统中的丰富资源。此外,Clojure的REPL(Read-Eval-Print Loop)是一个强大的开发工具,它允许开发者实时测试和调试代码,快速迭代,...

    Clojure入门教程.pdf

    - **应用场景**:广泛应用于Web开发、数据分析、并行计算等领域。 #### 二、Clojure语法基础 - **基础语法**:Clojure采用S表达式作为语法结构的基础,所有的代码都是由括号构成的列表。 - **数据类型**:包括但不...

    Clojure Data Analysis Cookbook

    - **大规模数据处理**:利用 Clojure 处理大数据集的技术,包括并行和分布式计算框架的使用。 - **Web 开发集成**:展示如何将数据分析结果嵌入 Web 应用程序中,实现数据驱动的动态网站。 4. **高级篇**:涵盖 ...

    Scala与Clojure函数式编程模式:Java虚拟机高效编程1

    【Scala与Clojure】 Scala和Clojure都是现代函数式编程语言,它们都运行在Java虚拟机(JVM)上,能够利用Java的生态系统和资源。Scala是一种多范式语言,结合了面向对象和函数式编程的特点,提供了强大的类型系统和...

    Clojure资格web资源

    Clojure的设计目标是提供一种静态类型系统的动态语言,支持并发和分布式计算,同时保持简洁和表达力强的语法。在这个"Clojure资格web资源"的压缩包中,包含了几个关键的学习资料,帮助初学者和有经验的开发者深入...

    蚂蚁群优化算法演示:使用 Clojure 创建_Clojure _代码_下载

    **蚂蚁群优化算法(Ant Colony Optimization, ACO)**是一种基于生物群体行为的全局优化方法,源于对蚂蚁寻找食物路径的行为观察。...对于想要学习ACO算法或深入理解Clojure并行处理的开发者来说,这是一个宝贵的资源。

    Clojure Data Structures and Algorithms Cookbook

    4. **并发与并行编程**:探讨如何在Clojure中利用多核处理器的优势进行高效并行计算。 #### 四、核心章节解读 1. **第1章:Clojure简介与环境搭建** - 介绍Clojure的基本特性和语法。 - 指导读者如何安装配置...

    任务:Clojure的简单功能并行并发原语

    1. **pmap和parseq**:这两个函数是Clojure并行处理序列的工具。`pmap`是`map`的并行版本,它会将任务分配到多个核心上执行,提高处理速度。`parseq`则用于并行处理惰性序列,同样利用多核优势。 2. **thread**:这...

    wire:Clojure声明式计算图

    默认情况下,它不提供任何备注,缓存,并行计算,部分评估或React式编程。 该库的灵感来自使用公式的形式,既可以手写形式也可以通过电子表格给出。 由于多种原因,使用它们可能会很棘手: 所有变量/单元格都具有...

    Programming_Clojure.pdf

    5. **科学计算**:Clojure的数学库和数值计算能力使得它成为科学计算领域的一个不错的选择。 #### 四、学习资源推荐 1. **《Programming Clojure》**:这是学习Clojure的第一本书,适合初学者入门。书中详细介绍了...

    在 Clojure中实现遗传算法的框架_Clojure_代码_下载

    Clojure的设计理念强调简洁、表达性和并行计算能力,这使得它成为实现高效遗传算法的理想选择。在这个框架中,我们可以预期以下几个关键组件: 1. **种群(Population)**:种群是遗传算法的核心,由多个个体(或...

    Clojure编程乐趣_PDF电子书下载 带书签目录 完整版

    4. **科学计算**:Clojure的数学库和并行处理能力使其在科学计算领域有着广泛的应用前景。 5. **企业级应用**:得益于其运行在JVM上,Clojure可以很好地集成到现有的Java生态系统中,适合开发企业级应用。 综上所述...

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

    在现代编程实践中,...通过理解并应用原子操作、STM、代理和并行计算,开发者可以有效地解决并发编程中的挑战。Clojure的并发模型不仅提高了程序的性能,还通过减少锁的使用和简化状态管理来提高了代码的可维护性 。

    kafka-streams-clojure:Clojure换能器与Kafka Streams的接口

    此外,由于Clojure天生支持并行计算,因此`kafka-streams-clojure`也能够很好地利用多核CPU,提升处理大数据流的性能。 总的来说,`kafka-streams-clojure`为Clojure开发者提供了一个强大的工具,使得他们能够充分...

    clojurecl:ClojureCL是一个Clojure库,用于使用OpenCL进行并行计算

    ClojureCL是一个Clojure库,用于与OpenCL进行并行计算。 它支持最新的OpenCL 2.0版本,并使用提供的快速手写JNI绑定与供应商的OpenCL平台驱动程序进行通信。 如何使用它 阅读的文档。 执照 版权所有:copyright:2015...

Global site tag (gtag.js) - Google Analytics