executor

axios CancelToken 取消频繁发送请求的用法和源码解析

大城市里の小女人 提交于 2020-02-05 00:44:13
前言 做一个Vue的项目时,遇到频繁切换标签的问题。由于不同标签请求的ajax的结果所需时间不同,点击不同标签时,响应时间最慢的数据会覆盖之前响应的数据,显示数据跟所点击标签不对应。当时为了处理这个问题,没想到好方法,只好控制在点击下一个标签前,必须等前一个标签的结果回来之后进行。 后来做API的统一管理时,看到前人写的axios的interceptor里有CancelToken这样一个东西,查了查资料,发现这个可以取消请求,踏破铁鞋无觅处,刚好可以用来处理之前遇到的频繁切换标签的问题。今作一记录,也好更好的理解这个功能。 述求 点击标签时,取消之前正在执行的请求,使得切换标签时,页面得到的是最后请求的结果,而不是响应最慢的结果。 用法 官方案例 使用 CancelToken.source 工厂方法创建 cancel token,像这样: // CancelToken是一个构造函数,用于创建一个cancelToken实例对象 // cancelToken实例对象包含了一个promise属性,值为可以触发取消请求的一个promise const CancelToken = axios . CancelToken ; // 执行source()得到的是一个包含了cancelToken对象和一个取消函数cancel()的对象 // 即 source = {token:

CompletableFuture异步调用

a 夏天 提交于 2020-02-04 23:45:34
提要:在大型的项目某个主业务里,某个请求的调用,需要访问许多个微服务,才可以完成,但由于是远程调用,多微服务调用之间的延迟太高,用户的体验度太差,所以使用异步编排技术,由起初的一个线程执行,到多个线程异步执行,缩短请求的时间。 CompletableFuture介绍 Future是Java 5添加的类,用来描述一个异步计算的结果。你可以使用 isDone 方法检查计算是否完成,或者使用 get 阻塞住调用线程,直到计算完成返回结果,你也可以使用 cancel 方法停止任务的执行。 虽然 Future 以及相关使用方法提供了异步执行任务的能力,但是对于结果的获取却是很不方便,只能通过阻塞或者轮询的方式得到任务的结果。阻塞的方式显然和我们的异步编程的初衷相违背,轮询的方式又会耗费无谓的CPU资源,而且也不能及时地得到计算结果,为什么不能用观察者设计模式当计算结果完成及时通知监听者呢? 很多语言,比如Node.js,采用回调的方式实现异步编程。Java的一些框架,比如Netty,自己扩展了Java的 Future 接口,提供了 addListener 等多个扩展方法;Google guava也提供了通用的扩展Future;Scala也提供了简单易用且功能强大的Future/Promise异步编程模式。 作为正统的Java类库,是不是应该做点什么,加强一下自身库的功能呢? 在Java 8中

解决Ubuntu18中的pycharm不能调用tensorflow-gpu

北战南征 提交于 2020-02-04 22:12:09
问题描述:我通过控制台使用tensorflow-gpu没问题,但是通过pycharm使用却不可以,如下所示: 通过控制台: answer@answer-desktop:/$ python Python 3.7.0 (default, Jun 28 2018, 13:15:42) [GCC 7.2.0] :: Anaconda, Inc. on linux Type "help", "copyright", "credits" or "license" for more information. >>> import tensorflow as tf 2020-02-04 21:37:12.964610: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libnvinfer.so.6'; dlerror: libnvinfer.so.6: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/cuda-10.1/lib64:/usr/local/cuda-10.1/lib64 2020-02-04 21:37:12

java并发框架--Executor

点点圈 提交于 2020-02-04 16:01:43
Executor简介 主要类 例子1 package exexutorTest; /** * 测试类 */ public class Main { public static void main(String[] args) { //创建执行服务器 Server server = new Server(); //创建100个任务,并发给执行器,等待完成 for (int i = 0; i < 100; i++) { Task task = new Task("id "+ i); server.submitTask(task);//执行任务 } server.endServer(); } } package exexutorTest; import java.util.Date; /** * 任务类 */ public class Task implements Runnable { private String id;//任务id public Task(String id) { this.id = id; } @Override public void run() { try { Long duration=(long)(Math.random()*1000); System.out.printf("%s: Task %s: Doing a task during %d

Netty源码解析(一)初始化

梦想的初衷 提交于 2020-02-04 07:52:17
Netty运行整体流程: 以后的讲究都会按着这幅图来理解 1.对NioEventLoopGroup的整体流程 从第一行代码分析 EventLoopGroup bossGroup=new NioEventLoopGroup(1);//cpu核心数*2 EventLoopGroup workerGroup=new NioEventLoopGroup(); //cpu核心数*2 看NioEventLoopGroup的构造方法 public NioEventLoopGroup(int nThreads) { //这里给Executor赋值为null this(nThreads, (Executor) null); } 继续往里面跟 public NioEventLoopGroup(int nThreads, Executor executor) { //executor默认为null //ServerSocketChannel 就是通过ServerSocketChannel.open()==》SelectorProvider.provider().openServerSocketChannel()创建的 this(nThreads, executor, SelectorProvider.provider()); } 这里可以把SelectorProvider.provider(

寒假记录3

柔情痞子 提交于 2020-02-03 14:28:29
今天的主要活动是完成了实验一Linux系统常用命令 Spark运行基本流程   (1)当一个 Spark Application 被提交时,首先需要为这个应用构建起基本的运行环境, 即由 Driver 创建一个 SparkContext进行资源的申请、任务的分配和监控。 SparkContext 会向资源管理器注册并申 请运行 Executor 的资源;   (2)资源管理器为 Executor 分配资源,并启动 Executor 进程, Executor 启动以后会不断向资源管理器汇报其运行情况   (3)SparkContext 根据 RDD 的依赖关系构建 DAG 图,DAG 图提交给 DAGScheduler 进行解析,将 DAG 图分解成 Stage,并且计算出各个 Stage 之间的依赖关系,( 每一个Stage阶段里面都会包含多个task,这些task构成一个taskset )然后把一个个 TaskSet 提交给底层任务调度器 TaskScheduler 进行处理; ( TaskScheduler拿到taskset以后要把任务分配给相关的Executor 进程去运行这些task,但是它不能随便分配 必须接到Executor申请才会分配 ) Executor 会向 SparkContext 申请 Task,Task

spark源码之Shuffle Write

梦想与她 提交于 2020-02-03 00:19:47
一、shuffle定义    shuffle,即为洗牌的意思,在大数据计算中,无论是mapreduce框架还是spark框架,都需要shuffle,那是因为在计算的过程中,具有某种特征的数据最终需要汇聚在一个节点上进行计算,这些数据是分部在集群中不同的节点上由各自节点进行计算。就比如以workcount为例:   其中数据是分别保存在节点Node1,Node2,Node3上,经过处理之后,数据最终会汇聚到结点Node a和Node b上进行处理。   而这个数据重新打乱然后重新汇聚到不同节点的过程就是shuffle , 但是实际情况下,shuffle的要比这个复杂的多。 数据量会很大,比如单位为TB或PB的数据分散在几百甚至数千、数万台机器上。 为了将这些数据汇聚到正确的节点,需要将这些数据放到正确的partition,因为数据大小已经大于节点的内存,因此这个过程可能会发生多次的硬盘的续写。 为了节省带宽,这个数据可能需要压缩,如何在压缩率与压缩解压时间中间做一个较好的平衡,是需要我们考虑的。 数据需要通过网络传输,所以数据的序列化与反序列化也变得相对复杂。   一般情况下,每个task处理的数据是可以完全载入内存当中的(如果说不能的话,可以减小partition的大小),所以task可以做到内存中计算,除非非常复杂的计算逻辑,否则,如果为了容错而持久化中间数据,是没有太大的收益的

spring event机制

萝らか妹 提交于 2020-01-31 15:49:45
Spring增加了event事件机制,方便了日常项目中需要业务解藕的开发场景,也支持异步和重试机制,很多场景都可以使用 目前开发的项目中需要记录一些异常单据信息的记录,主流程中正常单据接单的流程不动,在识别出某种异常后记录,但是这种记录不应该影响主流程,所以考虑用Spring的event异步事件处理 1.什么是事件机制 Java的设计模式中有两种设计模式,观察者模式和监听者模式 监听者模式: 当有一个事件发生时,通知关注此事件的对象,告诉事件发生了就发布这个事件,那怎么知道通知谁呢,所以需要知道谁关心这个事件,那么就需要对这个事件关心的对象中定义一个事件,如果事件发生了,关心的这个对象就监听到了,可以执行相应的操作。 观察者模式: 一对多的模式,一个被观察者Observable和多个观察者Observer,被观察者中存储了所有的观察者对象,当被观察者接收到一个外界的消息,就会遍历广播推算消息给所有的观察者 例如日常生活中的订阅报纸,报纸老板A,现在小明和老板打招呼说我要订报纸(这个过程就相当于观察者的注册),老板A就会拿出自己的小本本记下小明,下次小王、小芳也是类似的操作,现在老板A就有了三个观察者了,然后老板会自动的把报纸送到三位的家里,突然有一天小明说不想订报纸了,老板就在自己的小本本上划掉小明的名字(观察者的取消注册),等到送报纸的时候就不再送到小明家里。 2

Mybatis Executor原理分析

我与影子孤独终老i 提交于 2020-01-31 06:46:23
Executor是Mybatis里面重要的一个接口,是4大对象(Executor、StatementHandler、ParameterHandler、ResultSetHandler)中的一个,下面我们先来看看Executor的继承关系图: Mybatis默认启用了 CachingExecutor ,它是用来做二级缓存的,但是如果没有配置 <cache /> 的话默认不启用二级缓存。它根据 ExecutorType 来进行选择不同的 Executor ,并在它内部维护了一个 delegate 的Executor对象,用它来执行真正的请求,说白了就是个装饰者模式。 // 只列出了重要的部分,可以看它就是通过delegate来执行真正的方法的 public class CachingExecutor implements Executor { private Executor delegate; private TransactionalCacheManager tcm = new TransactionalCacheManager(); public CachingExecutor(Executor delegate) { this.delegate = delegate; delegate.setExecutorWrapper(this); } @Override public

MyBatis Executor 对比分析

て烟熏妆下的殇ゞ 提交于 2020-01-30 10:03:11
MyBatis Executor 对比分析 Executor 类图 主要分析 SimpleExecutor , ReuseExecutor , BatchExecutor , CachingExecutor 的不同点,以及实际使用中该如何选择。 image.png BaseExecutor BaseExecutor 主要是使用了模板设计模式(template), 共性被封装在 BaseExecutor 中 , 容易变化的内容被分离到了子类中 。 SimpleExecutor MyBatis 的官方文档中对 SimpleExecutor 的说明是 "普通的执行器" , 普通就在于每一次执行都会创建一个新的 Statement 对象 。下面看一下 mybatis 创建 Statement 对象的代码 : // BaseStatementHandler 中的方法 @Override public Statement prepare(Connection connection, Integer transactionTimeout) throws SQLException { ErrorContext.instance().sql(boundSql.getSql()); Statement statement = null; try { statement =