Clojure 的并发(一) Ref和STM
Clojure 的并发(二)Write Skew分析
Clojure 的并发(三)Atom、缓存和性能
Clojure 的并发(四)Agent深入分析和Actor
Clojure 的并发(五)binding和let
Clojure的并发(六)Agent可以改进的地方
Clojure的并发(七)pmap、pvalues和pcalls
Clojure的并发(八)future、promise和线程

前面几节基本介绍Clojure对并发的支持,估计这个系列还能写个两三节,介绍下一些常见的concurrent function的使用。谈了很多优点,现在想谈谈clojure的一些缺憾,例如Agent系统。

Agent在前面已经介绍过了,用于异步更新,基本的原理是将更新操作封装为action,提交给线程池处理。内部有两个线程池,固定大小(cpus+2)的线程池用于处理send发送的action,而send-off发送的action则是由一个Cached ThreadPool处理的。因此,如果你的更新操作很耗时或者会阻塞(如IO操作),那么通常是建议使用send-off,而send适合一些计算密集型的更新操作。两个线程池的声明如下(Agent.java):

1 final public static ExecutorService pooledExecutor =
2         Executors.newFixedThreadPool(2 + Runtime.getRuntime().availableProcessors());

4 final public static ExecutorService soloExecutor = Executors.newCachedThreadPool();

说说我认为Agent可以改进的地方。
    首先是从实践角度出发,通常我们要求new一个线程池的时候,要设置线程池内线程的name,以方便查看和调试。因此Clojure这里简单的new线程池是一个可以改进的地方,应当自定义一个ThreadFactory,给clojure的Agent线程提供明确的名称。

其次,由于这两个线程池是全局的,因此clojure提供了shutdown-agents的方法用于关闭线程池。但是由于这些线程池内的线程并非daemon,因此如果你没有明确地调用shutdown-agents,jvm也可以正常退出。我们都知道,如果还有dadmon线程没有终止,JVM是无法退出的。如果JVM只剩下daemon线程,那么jvm就会自动退出。从实践角度,应当明确地要求用户调用shutdown-agents来关闭Agent系统,妥善终止线程,并且Agent的线程池应当延迟初始化,只在必要的时候创建,而非现在的静态变量。所以,在实现ThreadFactory的时候,应当设置生成的线程为daemon。

第三,同样由于线程池是全局的,关闭了却没有办法重新启动,这不能不说是一个缺憾。Clojure没有提供重新启动的方法。

第四,线程池简单地分为两类,从理论上足以满足大部分应用的要求。但是在real world的应用上,我们通常不敢用CachedThreadPool,这是为了防止内存不受控,导致线程创建过多直接OOM。通常我们会使用固定大小的线程池,但是clojure固定大小的线程池只有一个,并且大小写死为cpus+2,这就没有了控制的余地。我还是希望clojure能提供允许自定义Agent线程池的方法,可以在创建的时候传入线程池,如:

(agent :executor (java.util.concurrent.Executors/newFixedThreadPool 2))

或者提供新的API,如set-executor!来设置agent使用的线程池,如果没有自定义线程池再使用全局的。当然也需要提供一个关闭agent自定义线程池的API:

(shutdown-agent agent)

需要自定义线程池是另一个原因是为了最大化地发挥线程池的效率,我们知道,线程池只有在执行“同构”任务的时候才能发挥最大的效率,如果有的 action快,有的action慢,那么该快的快不起来,慢的却挤占了快的action的执行时间。通过给Agent设定自己的线程池某些程度上可以解决这个问题。

Agent的整个模型是很优雅的,但是确实还有这些地方不是特别让人满意,希望以后会得到改进。

文章转自庄周梦蝶  ,原文发布时间 2010-07-30

Clojure的并发(六)Agent可以改进的地方相关推荐

  1. Clojure的并发(七)pmap、pvalues和pcalls

    Clojure 的并发(一) Ref和STM Clojure 的并发(二)Write Skew分析 Clojure 的并发(三)Atom.缓存和性能 Clojure 的并发(四)Agent深入分析和A ...

  2. Clojure的并发(一) Ref和STM

    Clojure 的并发(一) Ref和STM Clojure 的并发(二)Write Skew分析 Clojure 的并发(三)Atom.缓存和性能 Clojure 的并发(四)Agent深入分析和A ...

  3. 从根上理解高性能、高并发(六):通俗易懂,高性能服务器到底是如何实现的

    本文原题"高并发高性能服务器是如何实现的",转载请联系作者. 1.系列文章引言 1.1 文章目的 作为即时通讯技术的开发者来说,高性能.高并发相关的技术概念早就了然与胸,什么线程池 ...

  4. [vue] 你期待vue3.0有什么功能或者改进的地方?

    [vue] 你期待vue3.0有什么功能或者改进的地方? 用尤大的话说就是各种速度提升n倍.我希望在依赖node_modules能够做出调整,文件数目太多,开启项目每次都要下载 个人简介 我是歌谣,欢 ...

  5. c语言c11标准用得多吗,C语言的C11 标准有哪些改进的地方?C11 为何不如 C++11 流行?...

    1.   C语言的C11 标准有哪些改进的地方?会对各类C项目起到哪些帮助? 1. 对齐处理操作符 alignof,函数 aligned_alloc(),以及 头文件 . 2. _Noreturn 函 ...

  6. java并发策略_Java并发(六):并发策略

    通过多次优化实例来了解选择并发策略的正确姿势 通过模拟浏览器程序的渲染页面(Page-Rendering)功能,为了方便,假设HTML页面只会包含标签文本和图片以及URL; 第一个版本:串行加载页面元 ...

  7. 冲大厂:Java并发六十问,快来看看你会多少道

    这篇文章有点长,四万字,图文详解六十道Java并发面试题.人已经肝麻了,大家可以点赞.收藏慢慢看!扶我起来,我还能肝! 基础 1.并行跟并发有什么区别? 从操作系统的角度来看,线程是CPU分配的最小单 ...

  8. 面渣逆袭,Java并发六十问,快来看看你会多少道

    大家好,这节我们来盘一盘另一个面试必问知识点--Java并发. 这篇文章有点长,四万字,图文详解六十道Java并发面试题.人已经肝麻了,大家可以 点赞 . 收藏 慢慢看!扶我起来,我还能肝! 基础 1 ...

  9. 面渣逆袭:Java并发六十问,图文详解,快来看看你会多少道

    基础 1.并行跟并发有什么区别? 从操作系统的角度来看,线程是CPU分配的最小单位. 并行就是同一时刻,两个线程都在执行.这就要求有两个CPU去分别执行两个线程. 并发就是同一时刻,只有一个执行,但是 ...

最新文章

  1. MyCollection 程序 F&Q
  2. 中考考试的指令广播_明天FM105.2《朝朝早精神好》推出2017广州中考日特别报道...
  3. 如何把VS Code的Language Server Protocol整合到Eclipse中来
  4. mysqldump重叠备份带来的锁表问题
  5. itext库产生word文档示例(.doc)
  6. sklearn中的交叉验证(Cross-Validation)
  7. 案例实操:Azkaban调度spark作业
  8. python中print是什么意思_python中print什么意思
  9. android动态开发,android开发实现动态壁纸
  10. mybatis mysql 配置文件_mybatis简单应用(基于配置文件)_MySQL
  11. android 使用4大组件的源码,Android Jetpack架构组件之 Paging(使用、源码篇)
  12. 调用聚合数据新闻头条API
  13. 笔记本电脑的计算机配置在哪里可以找到,笔记本无线设置在哪里_笔记本电脑设置无线网络的步骤-win7之家...
  14. 2017-2018-2 20179215《网络攻防实践》第二周作业
  15. 从0开始的技术美术之路(美术篇)(二)角色设计基础
  16. 【python】使用py3-bencode打开torrent文件
  17. java毕业设计爱心扶贫超市管理系统Mybatis+系统+数据库+调试部署
  18. C语言外挂实战【转】
  19. 记一次在K8s集群搭建的MySQL主从无法正常启动之数据迁移恢复实践
  20. python对numpy数组求导_NumPy数组计算——python

热门文章

  1. 怎么做应力应变曲线_常用的应力测试方法及其在船舶系统零部件中的应用
  2. linux系统下安装游戏,在Linux系统下安装GameHub来管理所有游戏
  3. 计算机系统导论第九章,计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新)...
  4. IDEA报错 com.microsoft.sqlserver.jdbc.SQLServerException : 列名或所提供的数目与表定于不匹配
  5. 织梦网站调用变量失败_(自适应手机版)响应式精密机械模具类网站织梦模板 织梦仪器模具加工设备网站模板下载...
  6. matlab求数的因子,matlab中因子分析的函数factoran如何使用??
  7. php判断学生姓名,PHP基础案例三:判断学生星座
  8. 小程序服务商申请入口_商业版微信收款小程序商家申请开通流程指导
  9. dom不刷新 vue 加数据后_详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结...
  10. shellcode执行盒_简单shellcode学习