异步队列

spring之并发线程池 ThreadPoolTaskExcutor

守給你的承諾、 提交于 2020-04-07 05:34:26
#一 先说一些关键性的东西。 当 PoolSize<CorePoolSize 时增加 PoolSize; 当队列大小 < QueueCapacity 时由当前线程池执行 workQueue.offer(command); 当 PoolSize >= CorePoolSize && PoolSize<MaxPoolSize 时,且队列大小 >=QueueCapacity 时,新增线程数量,但大小必须 < MaxPoolSize. KeepAliveTime 是线程是否退出的衡量时间,但核心线程是否退出还要看 allowCoreThreadTimeOut else if (poolSize > corePoolSize || allowCoreThreadTimeOut) r = workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS); #二 下面是重点,Spring 中 ThreadPoolTaskExcutor ##1 异步配置类,为下边的异步注入提供配置 @EnableAsync @Configuration @ComponentScan("org.sselab.conf") public class TaskConfig implements AsyncConfigurer { @Override public Executor

Python中的异步任务队列 arq

自古美人都是妖i 提交于 2020-04-05 20:50:27
引言 最近在用 sanic 写东西,所有涉及到IO阻塞的代码都需要用 aio 的模块,好在近年来 asyncio 生态圈发展的还算不错,该有的都有 ~ 近期业务中 登录/注册 业务涉及的很复杂(涉及到邀请),需要解锁、发送短信等操作,想来这么个模块整的很繁琐,以后加个滑动验证那还了得。 于是乎,想整一个类似于 celery 的模块,进行任务解耦,但是目前 celery 还目前不支持异步(官方将在 celery5 支持异步)。 所以目前查阅资料发现了一个 python 实现的 arq 模块,已经应用在了生产环境,效果还算不错 ~ 官方是这么介绍它的: 非阻塞 延迟执行、定时任务、重试机制 快 优雅 小 首先先安装一下它: $ pip install arq 那么接下来,快速了解下它的使用吧 ~ 简单使用 先看下面编写的这段代码 # filename: tasks.py #! /usr/bin/env python # -*- coding: utf-8 -*- # Date: 2019/5/23 import asyncio from arq import create_pool from arq.connections import RedisSettings async def say_hello(ctx, name) -> None: """任务函数 Parameters --

js异步执行原理

寵の児 提交于 2020-04-04 11:56:05
我们都知道js是一个单线程的语言,所以没办法同时执行俩个进程。所以我们就会用到异步。 异步的形式有哪些那,es5的回调函数。es6的promis等 异步的运行原理我们可以先看下面这段代码 应该很多人都知道这个打印的值是10个10. 也有知道当我们执行的for循环的时候,他会把for循环执行完成以后再去执行 setTimeout ,在执行 setTimeout 的时候这是时候的i已经变成了10所以就打印10个10。 但是这里面的执行过程是这样的。我们用一个图来做解释 图画的有点丑啊,大致的执行流程就是这样。 在js执行的时候,我们在主线程执行的好好的,然后遇到了一个回调函数,然后他会把这个回调函数异步处理,就是放到事假队列中。 然后我们主线程接着去执行,当主线程执行完成以后,在去执行事件队列里的函数。然后进行返回。 在事件队列里,不存在从上到下进行执行。他会看那一个先执行完成,就直接返回那一个。 什么意思呢。我们看下面这个代码 执行结果为1然后2 当js执行的时候。这俩个会放进事件队列。js是从上往下执行。 所以他会先把1放入事件队列中,然后在放入2. 这就可以看出在事件队列中,谁先执行完成,就返会谁到主线程上。 这也是异步的一个执行过程 来源: https://www.cnblogs.com/chenyudi/p/12630702.html

JS系列-事件循环机制event Loop

那年仲夏 提交于 2020-04-03 18:45:05
任务   可以分成两种,一种是 同步任务 (synchronous),另一种是 异步任务 (asynchronous)。 同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务; 异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。 运行机制如下: (1)所有同步任务都在主线程上执行,形成一个 执行栈 (execution context stack)。 (2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。 (3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。 (4)主线程不断重复上面的第三步。只要主线程空了,就会去读取"任务队列" 任务队列: "任务队列"是一个事件的队列,IO设备完成一项任务,就在"任务队列"中添加一个事件,表示相关的异步任务可以进入"执行栈"了。主线程读取"任务队列",就是读取里面有哪些事件; 除了IO设备的事件以外,还包括一些用户产生的事件(比如鼠标点击、页面滚动等等)。只要指定过回调函数,这些事件发生时就会进入"任务队列",等待主线程读取。 "回调函数

OC开发_整理笔记——多线程之GCD

泄露秘密 提交于 2020-04-03 10:22:10
一、进程和线程     二、各种队列!   1、GCD:Grand Central Dispatch   2、串行队列(Serial)     你 可以创建 任意个数的串行队列,每个队列依次执行添加的任务, 一个队列同一时刻只能执行一个任务 (串行),但是各个队列之间不影响,可以并发执行。每个队列中的任务运行在一个由各自串行队列    维护的独立线程上, 一个队列中只有一个线程 。   3、并行队列(Concurrent)     并行队列是 不允许自己创建 的,系统中存在三个不同优先级的并行队列。并行队列依旧按照任务添加的顺序启动任务,但是,后一个任务无须等待前一个任务执行完毕,而是启动第一个任务后,立即启动    下一个任务。至于同一时刻允许同时运行多少个任务由 系统决定 。任务各自运行在并行队列为他们提供的独立线程上, 并行队列中同时运行多少个任务,就必须维护多少个线程 。   4、主调度队列(main dispatch queue)     主调度队列中的任务运行在应用程序 主线程 上,所以,如果你要修改应用程序的界面,他是唯一的选择   5、全局队列(苹果为了方便多线程的设计,提供一个全局队列,供 所有的APP共同使用 ) 三、队列的任务处理   1、串行队列(✅ DISPATCH_QUEUE_SERIAL )的同步任务和异步任务:dispatch_sync 和

Java并发编程笔记之ArrayBlockingQueue源码分析

守給你的承諾、 提交于 2020-03-30 08:48:26
JDK 中基于数组的阻塞队列 ArrayBlockingQueue 原理剖析,ArrayBlockingQueue 内部如何基于一把独占锁以及对应的两个条件变量实现出入队操作的线程安全? 首先我们先大概的浏览一下ArrayBlockingQueue 的内部构造,如下类图: 如类图所示,可以看到ArrayBlockingQueue 内部有个数组items 用来存放队列元素,putIndex变量标示入队元素的下标,takeIndex是出队的下标,count是用来统计队列元素个数, 从定义可以知道,这些属性并没有使用valatile修饰,这是因为访问这些变量的使用都是在锁块内被用。而加锁了,就足以保证了锁块内变量的内存可见性。 另外还有个独占锁lock 用来保证出队入队操作的原子性,这保证了同时只有一个线程可以进行入队出队操作,另外notEmpty,notFull条件变量用来进行出队入队的同步。 由于ArrayBlockingQueue 是有界队列,所以构造函数必须传入队列大小的参数。 接下来我们进入ArrayBlockingQueue的源码看,如下: public ArrayBlockingQueue(int capacity) { this(capacity, false); } public ArrayBlockingQueue(int capacity, boolean fair

IOS多线程知识总结/队列概念/GCD/串行/并行/同步/异步

寵の児 提交于 2020-03-28 04:03:41
进程 :正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间; 线程 :线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程。 队列 : dispatch_queue_t,一种先进先出的数据结构, 线程的创建和回收不需要程序员操作,由队列负责。    串行队列 :队列中的任务只会顺序执行(类似跑步)        dispatch_queue_t q = dispatch_queue_create(“....”, dispatch_queue_serial);    并行队列 :队列中的任务通常会并发执行(类似赛跑)       dispatch_queue_t q = dispatch_queue_create("......", dispatch_queue_concurrent);    全局队列 :是 系统开发 的,直接拿过来(get)用就可以;与并行队列类似,但调试时,无法确认操作所在队列       dispatch_queue_t q = dispatch_get_global_queue(dispatch_queue_priority_default, 0);    主队列 :每一个应用程序对应唯一一个主队列,直接get即可;在多线程开发中,使用主队列更新UI        dispatch_queue

ICE异步程序设计-----AMI/AMD

梦想的初衷 提交于 2020-03-23 15:38:19
1 简介 AMI 异步方法调用(AMI) 这个术语描述的是客户端的异步编程模型支持。 如果你使用AMI 发出远地调用,在Ice run time 等待答复的同时,发出调用的线程不会阻塞。相反,发出调用的线程可以继续进行各种活动,当答复最终到达时, Ice run time 会通知应用。通知是通过回调发给应用提供的编程语言对象的 AMD 一个服务器在同一时刻所能支持的同步请求数受到Ice run time 的服务器线程池的尺寸限制(参见15.3 节)。如果所有线程都在忙于分派长时间运行的操作,那么就没有线程可用于处理新的请求,客户就会经验到不可接受的无响应状态。异步方法分派(AMD) 是AMI 的服务器端等价物 ,能够解决这个可伸缩性问题 。 在使用AMD 时,服务器可以接收一个请求,然后挂起其处理,以尽快释放分派线程。当处理恢复、结果已得出时,服务器要使用Ice runtime 提供的回调对象,显式地发送响应。 使用AMD时,客户端如果需要等待返回值,那就一直等待,否则就继续往下执行。 为什么使用AMD? 用实际的术语说, AMD 操作通常会把请求数据(也就是,回调对象和操作参数)放入队列 ,供应用的某个线程(或线程池)随后处理用。这样,服务器就使分派线程的使用率降到了最低限度,能够高效地支持数千并发客户。 另外, AMD 还可用于需要在完成了客户的请求之后继续进行处理的操作

浅析 Node.js 单线程模型

江枫思渺然 提交于 2020-03-21 10:24:47
总结笔记:对于每个用户请求,由主线程接收并存放于一个事件队列中(不做任何处理),当无请求发生时,即主线程空闲,主线程开始循环处理事件队列中的任务: 对于非阻塞JS程序: 1、若某事件需要I/O操作,则主线程发出I/O请求,然后继续执行,由底层的程序实现I/O并返回I/O数据(底层程序是多线程的,JS是单线程的),底层I/O线程处理完后将该事件重新放入事件队列并释放当前线程; 2、某事件不需要I/O操作,则主线程直接处理;(由其他线程处理后放入的事件此时也被主线程直接处理掉); 对于阻塞JS程序: 1、若某事件需要I/O操作,则主线程发出I/O请求,然后等待I/O结束,由底层的程序实现I/O并返回I/O数据,主线程获得该事件所需数据后继续处理该事件; 2、某事件不需要I/O操作,则主线程直接处理; 综上可知,node.js由js解释程序和底层代码实现,JS代码是主线程,是单线程执行,而底层代码是多线程,可同时处理多个I/O请求,js中的阻塞与非阻塞代码只决定js在I/O时继不继续执行(当然,若阻塞执行,底层多线程也没啥用了),而底层会为每一个I/O请求创建一个线程; 注意:这只是对Node.js的一个分析,用来理解nodejs的线程模型而已,实际使用要具体问题具体分析,建议结合http://www.runoob.com/nodejs/nodejs-callback

转: IO设计模式:Reactor和Proactor对比

一个人想着一个人 提交于 2020-03-19 02:44:30
转: https://segmentfault.com/a/1190000002715832 平时接触的开源产品如Redis、ACE,事件模型都使用的Reactor模式;而同样做事件处理的Proactor,由于操作系统的原因,相关的开源产品也少;这里学习下其模型结构,重点对比下两者的异同点; 反应器Reactor Reactor模式结构 Reactor包含如下角色: Handle 句柄;用来标识socket连接或是打开文件; Synchronous Event Demultiplexer:同步事件多路分解器:由操作系统内核实现的一个函数;用于阻塞等待发生在句柄集合上的一个或多个事件;(如select/epoll;) Event Handler:事件处理接口 Concrete Event HandlerA:实现应用程序所提供的特定事件处理逻辑; Reactor:反应器,定义一个接口,实现以下功能: 1)供应用程序注册和删除关注的事件句柄; 2)运行事件循环; 3)有就绪事件到来时,分发事件到之前注册的回调函数上处理; “反应”器名字中”反应“的由来: “反应”即“倒置”,“控制逆转” 具体事件处理程序不调用反应器,而是由反应器分配一个具体事件处理程序,具体事件处理程序对某个指定的事件发生做出反应;这种控制逆转又称为“好莱坞法则”(不要调用我,让我来调用你) 业务流程及时序图 应用启动