Clojure的并发(六)Agent可以改进的地方
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):
2 Executors.newFixedThreadPool(2 + Runtime.getRuntime().availableProcessors());
3
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线程池的方法,可以在创建的时候传入线程池,如:
或者提供新的API,如set-executor!来设置agent使用的线程池,如果没有自定义线程池再使用全局的。当然也需要提供一个关闭agent自定义线程池的API:
需要自定义线程池是另一个原因是为了最大化地发挥线程池的效率,我们知道,线程池只有在执行“同构”任务的时候才能发挥最大的效率,如果有的 action快,有的action慢,那么该快的快不起来,慢的却挤占了快的action的执行时间。通过给Agent设定自己的线程池某些程度上可以解决这个问题。
Agent的整个模型是很优雅的,但是确实还有这些地方不是特别让人满意,希望以后会得到改进。
文章转自庄周梦蝶 ,原文发布时间 2010-07-30
Clojure的并发(六)Agent可以改进的地方相关推荐
- Clojure的并发(七)pmap、pvalues和pcalls
Clojure 的并发(一) Ref和STM Clojure 的并发(二)Write Skew分析 Clojure 的并发(三)Atom.缓存和性能 Clojure 的并发(四)Agent深入分析和A ...
- Clojure的并发(一) Ref和STM
Clojure 的并发(一) Ref和STM Clojure 的并发(二)Write Skew分析 Clojure 的并发(三)Atom.缓存和性能 Clojure 的并发(四)Agent深入分析和A ...
- 从根上理解高性能、高并发(六):通俗易懂,高性能服务器到底是如何实现的
本文原题"高并发高性能服务器是如何实现的",转载请联系作者. 1.系列文章引言 1.1 文章目的 作为即时通讯技术的开发者来说,高性能.高并发相关的技术概念早就了然与胸,什么线程池 ...
- [vue] 你期待vue3.0有什么功能或者改进的地方?
[vue] 你期待vue3.0有什么功能或者改进的地方? 用尤大的话说就是各种速度提升n倍.我希望在依赖node_modules能够做出调整,文件数目太多,开启项目每次都要下载 个人简介 我是歌谣,欢 ...
- c语言c11标准用得多吗,C语言的C11 标准有哪些改进的地方?C11 为何不如 C++11 流行?...
1. C语言的C11 标准有哪些改进的地方?会对各类C项目起到哪些帮助? 1. 对齐处理操作符 alignof,函数 aligned_alloc(),以及 头文件 . 2. _Noreturn 函 ...
- java并发策略_Java并发(六):并发策略
通过多次优化实例来了解选择并发策略的正确姿势 通过模拟浏览器程序的渲染页面(Page-Rendering)功能,为了方便,假设HTML页面只会包含标签文本和图片以及URL; 第一个版本:串行加载页面元 ...
- 冲大厂:Java并发六十问,快来看看你会多少道
这篇文章有点长,四万字,图文详解六十道Java并发面试题.人已经肝麻了,大家可以点赞.收藏慢慢看!扶我起来,我还能肝! 基础 1.并行跟并发有什么区别? 从操作系统的角度来看,线程是CPU分配的最小单 ...
- 面渣逆袭,Java并发六十问,快来看看你会多少道
大家好,这节我们来盘一盘另一个面试必问知识点--Java并发. 这篇文章有点长,四万字,图文详解六十道Java并发面试题.人已经肝麻了,大家可以 点赞 . 收藏 慢慢看!扶我起来,我还能肝! 基础 1 ...
- 面渣逆袭:Java并发六十问,图文详解,快来看看你会多少道
基础 1.并行跟并发有什么区别? 从操作系统的角度来看,线程是CPU分配的最小单位. 并行就是同一时刻,两个线程都在执行.这就要求有两个CPU去分别执行两个线程. 并发就是同一时刻,只有一个执行,但是 ...
最新文章
- MyCollection 程序 F&Q
- 中考考试的指令广播_明天FM105.2《朝朝早精神好》推出2017广州中考日特别报道...
- 如何把VS Code的Language Server Protocol整合到Eclipse中来
- mysqldump重叠备份带来的锁表问题
- itext库产生word文档示例(.doc)
- sklearn中的交叉验证(Cross-Validation)
- 案例实操:Azkaban调度spark作业
- python中print是什么意思_python中print什么意思
- android动态开发,android开发实现动态壁纸
- mybatis mysql 配置文件_mybatis简单应用(基于配置文件)_MySQL
- android 使用4大组件的源码,Android Jetpack架构组件之 Paging(使用、源码篇)
- 调用聚合数据新闻头条API
- 笔记本电脑的计算机配置在哪里可以找到,笔记本无线设置在哪里_笔记本电脑设置无线网络的步骤-win7之家...
- 2017-2018-2 20179215《网络攻防实践》第二周作业
- 从0开始的技术美术之路(美术篇)(二)角色设计基础
- 【python】使用py3-bencode打开torrent文件
- java毕业设计爱心扶贫超市管理系统Mybatis+系统+数据库+调试部署
- C语言外挂实战【转】
- 记一次在K8s集群搭建的MySQL主从无法正常启动之数据迁移恢复实践
- python对numpy数组求导_NumPy数组计算——python
热门文章
- 怎么做应力应变曲线_常用的应力测试方法及其在船舶系统零部件中的应用
- linux系统下安装游戏,在Linux系统下安装GameHub来管理所有游戏
- 计算机系统导论第九章,计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新)...
- IDEA报错 com.microsoft.sqlserver.jdbc.SQLServerException : 列名或所提供的数目与表定于不匹配
- 织梦网站调用变量失败_(自适应手机版)响应式精密机械模具类网站织梦模板 织梦仪器模具加工设备网站模板下载...
- matlab求数的因子,matlab中因子分析的函数factoran如何使用??
- php判断学生姓名,PHP基础案例三:判断学生星座
- 小程序服务商申请入口_商业版微信收款小程序商家申请开通流程指导
- dom不刷新 vue 加数据后_详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结...
- shellcode执行盒_简单shellcode学习