executor

Removing all queued tasks of an ThreadPoolExecutor

三世轮回 提交于 2019-11-28 07:19:51
i have this rather simple question about the ThreadPoolExecutor . I have the following situation: I have to consume objects from a queue, create the appropiate worker tasks for them and submit them to the ThreadPoolExecutor. This is quite simple. But within a shutdown scenario many workers may be queued to execution. Since one of those tasks might be running for an hour, and i want a relativly fast graceful shutdown of the application i want to discard all queued tasks from the ThreadPoolExecutor while the already processing tasks should be completed normally. The ThreadPoolExecutor

coalesce 与 repartition的区别

不问归期 提交于 2019-11-28 07:17:40
目录 一.spark 分区 partition的理解 二.coalesce 与 repartition的区别(我们下面说的coalesce都默认shuffle参数为false的情况) 三.实例 1. coalesce 2. repartition 四.总结 一.spark 分区 partition的理解 spark中是以vcore级别调度task的。 如果读取的是hdfs,那么有多少个block,就有多少个partition 举例来说:sparksql 要读表T, 如果表T有1w个小文件,那么就有1w个partition 这时候读取效率会较低。假设设置资源为 --executor-memory 2g --executor-cores 2 --num-executors 5。 步骤是拿出1-10号10个小文件(也就是10个partition) 分别给5个executor读取(spark调度会以vcore为单位,实际就是5个executor,10个task读10个partition) 如果5个executor执行速度相同,再拿11-20号文件 依次给这5个executor读取 而实际执行速度不会完全相同,那就是哪个task先执行完,哪个task领取下一个partition读取执行,以此类推。这样往往读取文件的调度时间大于读取文件本身,而且会频繁打开关闭文件句柄,浪费较为宝贵的io资源

《深入理解mybatis原理》 MyBatis的一级缓存实现详解 及使用注意事项

老子叫甜甜 提交于 2019-11-28 07:07:42
0.写在前面 MyBatis 是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓存机制上。 MyBatis 提供了一级缓存、二级缓存 这两个缓存机制,能够很好地处理和维护缓存,以提高系统的性能。本文的目的则是向读者详细介绍 MyBatis 的一级缓存,深入源码,解析 MyBatis 一级缓存的实现原理,并且针对一级缓存的特点提出了在实际使用过程中应该注意的事项。 读完本文,你将会学到: 1、什么是一级缓存?为什么使用一级缓存? 2、MyBatis的一级缓存是怎样组织的?(即SqlSession对象中的缓存是怎样组织的?) 3、 一级缓存的生命周期有多长? 4、Cache接口的设计以及CacheKey的定义 5、一级缓存的性能分析以及应该注意的事项 1. 什么是一级缓存? 为什么使用一级缓存? 每当我们使用 MyBatis 开启一次和数据库的会话, MyBatis 会创建出 一个 SqlSession 对象表示一次数据库会话 。 在对数据库的一次会话中,我们有可能会反复地执行完全相同的查询语句,如果不采取一些措施的话,每一次查询都会查询一次数据库,而我们在极短的时间内做了完全相同的查询,那么它们的结果极有可能完全相同,由于查询一次数据库的代价很大,这有可能造成很大的资源浪费。 为了解决这一问题,减少资源的浪费, MyBatis 会在表示会话的

How is an executor termination recursion in java?

混江龙づ霸主 提交于 2019-11-28 06:31:53
问题 This is a program that reads information site for previous format it uses recursion and executor.It works fine,my problem is to test whether the program is completed and success notification. public class NewClass { static String levels[] = { "div.col-md-9 li a", "div#sidebar ul li a" }; static String links = ""; private void getRecursive(String href, int level, final ExecutorService executor) { if (level > levels.length - 1) { return; } Document doc; try { doc = Jsoup.connect(href).get();

使用executor、callable以及一个Future 计算欧拉数e

家住魔仙堡 提交于 2019-11-28 06:05:19
package test; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class CaculateE { final static int num=17; public static void main(String[] args) { // TODO Auto-generated method stub //使用线程池防止多条人物提交而创建的线程 ExecutorService executor=Executors.newFixedThreadPool(1); Callable<BigDecimal> callable=new Callable<BigDecimal>() { @Override public

concurrent.futures:线程池,让你更加高效、并发的处理任务

大憨熊 提交于 2019-11-28 05:51:35
并发任务池 concurrent.futures模块提供了使用工作线程或进程池运行任务的接口。 线程池和进程池的API是一致的,所以应用只需要做最小的修改就可以在线程和进程之间进行切换 这个模块提供了两种类型的类与这些池交互。执行器(executor)用来管理工作线程或进程池,future用来管理计算的结果。 要使用一个工作线程或进程池,应用要创建适当的执行器类的一个实例,然后向它提交任务来运行。 每个任务启动时,会返回一个Future实例。需要任务的结果时,应用可以使用Future阻塞,直到得到结果。 目前已经提供了不同的API,可以很方便地等待任务完成,所以不需要直接管理Future对象。 Future对象 Future对象是一个比较奇特的对象,当然并不仅仅只是在这里有,像asyncio、tornado等,都有Future对象。怎么理解这个对象呢?Future直译是未来对象,换句话说,就是将我们的任务(函数)进行一层包裹,封装为未来对象。可以把Future看成是任务的一个容器,除了能够销毁任务,里面还包含了任务的执行状态。任务没有执行完没有关系,先占一个坑,绑定一个回调。我去异步执行其他的任务,当该任务完成后,通过future.set_result将任务的返回值设置进去,一旦设置了,那么会自动的触发回调函数,可以通过future.result将返回值获取出来。

Mybatis框架(8)---Mybatis插件原理

╄→гoц情女王★ 提交于 2019-11-28 04:14:02
Mybatis插件原理 在实际开发过程中,我们经常使用的Mybaits插件就是分页插件了,通过分页插件我们可以在不用写 count语句和limit 的情况下就可以获取分页后的数据,给我们开发带来很大 的便利。除了分页,插件使用场景主要还有更新数据库的通用字段,分库分表,加解密等的处理。 这篇博客主要讲Mybatis插件原理,下一篇博客会设计一个Mybatis插件实现的功能就是每当新增数据的时候 不用数据库自增ID而是通过该插件生成雪花ID ,作为每条数据的主键。 一、JDK动态代理+责任链设计模式 Mybatis的插件其实就是个 拦截器功能 。它利用 JDK动态代理和责任链设计模式的综合运用 。采用责任链模式,通过动态代理组织多个拦截器,通过这些拦截器你可以做一些 你想做的事。所以在讲Mybatis拦截器之前我们先说说JDK动态代理+责任链设计模式。有关JDK动态代理的原理,可以参考我之前写的一篇博客: 【java设计模式】---代理模式 1、JDK动态代理案例 public class MyProxy { /** * 一个接口 */ public interface HelloService{ void sayHello(); } /** * 目标类实现接口 */ static class HelloServiceImpl implements HelloService{

【sparkSQL】SparkSession的认识

不想你离开。 提交于 2019-11-28 01:56:23
https://www.cnblogs.com/zzhangyuhang/p/9039695.html https://www.jianshu.com/p/dea6a78b9dff 在Spark1.6中我们使用的叫Hive on spark,主要是依赖hive生成spark程序,有两个核心组件SQLcontext和HiveContext。 这是Spark 1.x 版本的语法 1 2 3 4 5 //set up the spark configuration and create contexts val sparkConf = new SparkConf().setAppName( "SparkSessionZipsExample" ).setMaster( "local" ) // your handle to SparkContext to access other context like SQLContext val sc = new SparkContext(sparkConf).set( "spark.some.config.option" , "some-value" ) val sqlContext = new org.apache.spark.sql.SQLContext(sc) 而Spark2.0中我们使用的就是sparkSQL,是后继的全新产品

关于粗粒度细粒度

冷暖自知 提交于 2019-11-28 01:14:55
一、粗粒度 1.工作原理: (1)Spark Streaming接收到实时数据流(data stream) (2)Spark Streaming把数据按照指定的时间段切成一片片小的数据块(小批次) (3)然后Spark Streaming把小的数据块传给Spark Engine处理 (4)Spark Engine处理后,输出处理后的数据(processed result) 每个应用程序的运行环境由一个Driver和若干个Executor组成,其中,每个Executor占用若干个资源,内部可运行多个Task,应用程序的各个任务正式运行之前,需要将运行环境中的资源全部申请好,且运行过程中要一直占用这些资源(即使不用),最后程序运行结束之后,回收这些资源 Spark是一个典型粗粒度资源调度。 二、细粒度 1.工作原理: (1)driver:启动spark应用程序,构建StreamingContext (2)executor:启动receiver接收器,接收数据 (3)executor:接收input Stream,然后拆分不同block(小块) (4)executor:receiver将block存储信息发送给StreamingContext (5)driver:启动job,然后将task提交到对应executor上执行 与粗粒度模式一样,应用程序启动时,辉县启动executor

从零写一个编译器(十):编译前传之直接解释执行

泄露秘密 提交于 2019-11-28 00:07:45
项目的完整代码在 C2j-Compiler 前言 这一篇不看也不会影响后面代码生成部分 现在经过词法分析语法分析语义分析,终于可以进入最核心的部分了。前面那部分可以称作编译器的前端,代码生成代码优化都是属于编译器后端,如今有关编译器的工作岗位主要都是对后端的研究。当然现在写的这个编译器因为水平有限,并没有优化部分。 在进行代码生成部分之前,我们先来根据AST来直接解释执行,其实就是对AST的遍历。现代解释器一般都是生成一个比较低级的指令然后跑在虚拟机上,但是简单起见我们就直接根据AST解释执行的解释器。(原本这部分是不想写的,是可以直接写代码生成的) 这次的文件在interpreter包里,这次涉及到的文件比较多,就不列举了 一个小问题 在开始说解释器的部分前我们看一下,认真观察之前在构造符号表对赋初值的推导式的处理是有问题的,但是问题不大,只要稍微改动一下 在github源代码的部分已经改了,改动如下: case SyntaxProductionInit.VarDecl_Equal_Initializer_TO_Decl: attributeForParentNode = (Symbol) valueStack.get(valueStack.size() - 3); ((Symbol) attributeForParentNode).value = initialValue;