异步队列

event-loop 事件轮循

丶灬走出姿态 提交于 2020-03-01 11:02:20
例1 setTimeout ( ( ) => console . log ( 3 ) , 100 ) setTimeout ( ( ) => console . log ( 2 ) ) consold . log ( 1 ) 废话不多我们直入主题。首先 consold.log(1) 会直接输出因为是同步函数,之后会把setTimeout(()=> console.log(2))放入异步队列,之后是setTimeout(()=> console.log(3), 100)放入异步队列( 因为有100毫秒的延迟,所以不在setTimeout(()=> console.log(2))前面 ),然后事件轮询机制会去异步队列里找有没有需要执行的函数,如果有就会放入主进程执行输出一直如此询环直到没有函数可以执行位置,最后输出是 1 2 3 例2 $ . ajax ( { url : 'http://xxxxx' , succes : ( ) => { console . log ( ' 4 ) } } ) setTimeout ( ( ) => console . log ( 3 ) , 500 ) setTimeout ( ( ) => console . log ( 2 ) ) consold . log ( 1 ) 这里多了一个ajax其实就是一个障眼法说白了ajax也是异步代码

进程-线程-多线程-异步

蹲街弑〆低调 提交于 2020-03-01 06:58:07
进程-线程-多线程-异步 一、多线程的本质 1、并发多线程的启动、结束顺序 a、如何控制多线程的调用顺序 b、阻塞主线程等待子线程 二、异步操作的本质 三、线程 1、Thread 2、ThreadPool 3、Task 4、TaskFactory 5、Parallel 6、async await 语法糖 四、异常处理 五、线程取消 六、线程安全 一、多线程的本质 cpu的计算速度太快了导致硬件跟不上,就是木桶原理(盛水多少取决于最短板)。 cpu的计算能力很强,所以cpu可以分“时间片”,一个cpu可以分N+个时间片,每个时间片上跑一个线程(代码流)。cpu按顺序执行时间片,因为cpu太强,线程切换的太快,导致人感觉不出执行的卡顿,感觉上是多线程并发的。 微观角度:一个核同一时刻只能执行一个线程; 宏观角度: 是多线程并发的。 cpu分时间片执行线程,线程所需资源的不同会导致有 上下文的切换 ,其实上下文的切换会有性能的损失,但因为cpu计算能力超过其它硬件太多,不损失也是浪费。 扩展:4核8线程—核是物理的核,这里的线程是指虚拟核(一个核虚拟出2个核)。 1、并发多线程的启动、结束顺序 并发线程的启动是无序。 执行相同代码的并发线程的运行时间也不相同,所以结束时间也不同。 a、如何控制多线程的调用顺序 可以用委托提供的BeginInvoke方法,它是异步线程方法,并支持回调函数

异步 JavaScript

别说谁变了你拦得住时间么 提交于 2020-03-01 02:36:24
简评:如果你对 JavaScript 异步的原理感兴趣,这里有一篇不错的介绍。 JavaScript 同步代码是如果工作的 在介绍 JavaScript 异步执行之前先来了解一下, JavaScript 同步代码是如何执行的。 这里有两个概念需要了解: ** 执行上下文(Excution Context)** 执行上下文是一个抽象的概念,用于表示 JavaScript 的运行环境,任何代码都会有一个执行上下文。 全局代码运行在全局执行上下文,函数里的代码运行在函数执行上下文,每一个函数都有自己的执行上下文。 调用堆栈(Call Stack) 调用栈是一个具有 LIFO(后进先出)结构的栈,用于储存代码执行阶段所有的执行上下文。 因为 JavaScript 是单线程的,所以 JavaScript 只有一个单独的调用栈。 我们以下面例子介绍同步代码执行过程。 const second = () => { console.log('Hello there!'); } const first = () => { console.log('Hi there!'); second(); console.log('The End'); } first(); 创建全局上下文(由 main() 表示),并将全局上下文推到栈顶。然后依次将遇到函数执行上下文推到栈顶(如果函数中执行其他他函数

深入浅出NodeJS——异步I/O

一个人想着一个人 提交于 2020-02-29 19:36:50
底层操作系统,异步通过信号量、消息等方式有着广泛的应用。 PHP语言从头到尾都是以同步堵塞方式执行,利于程序猿顺序编写业务逻辑。 异步I/O、事件驱动、单线程构成Node的基调。 why异步I/O (1)、用户体验 在Web2.0中Ajax广泛应用异步刷新机制能够更好的提高用户体验,消除UI堵塞。后端相同採用异步I/O能够有效较少同一时候请求多个资源的效应时间其为max(M,N)。 (2)、资源分配 多任务主流方式: a. 单线程异步I/O b. 多线程并行 多线程的代价在于创建线程和运行期线程上下午切换的开销较大。在复杂场景中,多线程常常面临锁、状态同步的问题。但多线程能够更有效的利用多核CPU,提高利用率。 NodeJS利用单线程远离多线程死锁、状态同步等问题;利用异步I/O,让单线程远离堵塞,以更好利用CPU。 为了弥补单线程无法利用多核CPU特点,Node採用类似Web Workers的子进程。 异步I/O 操作系统内核对于I/O仅仅有两种方式:堵塞和非堵塞 堵塞I/O一个特点是调用之后一定要等到系统内核层面完毕全部操作后,调用才结束。其造成CPU等待I/O,浪费时间和资源,CPU利用不充分。 非堵塞I/O不同之处在于调用之后会马上返回。其问题在于为了获取完整的数据,应用程序须要反复调用I/O操作来确认是否完毕,这样的反复调用判定是否完毕的技术叫做 轮询 堵塞I

JavaScript的计时器的工作原理

只愿长相守 提交于 2020-02-29 17:00:18
最近都在看一些JavaScript原理层面的文章,恰巧看到了jQuery的作者的一篇关于JavaScript计时器原理的解析,于是诚惶诚恐地决定把原文翻译成中文,一来是为了和大家分享,二来是为了加深自己对于JavaScript的理解。原文链接: http://ejohn.org/blog/how-javascript-timers-work/ 原文翻译: 从基础层面来讲,理解JavaScript计时器的工作原理是很重要的。由于JavaScript是单线程的,所以很多时候计时器并不是表现得和我们的直观想象一样。让我们从下面的三个函数开始,它们能够让我们有机会去构造和操作计时器。 var id =setTimeout(fn, delay); -创建了一个简单的计时器,在经过给定的时间后,回调函数将会被执行。这个函数会返回一个唯一的ID,便于在之后某个时间可以注销这个计时器。 var id = setInterval(fn, delay); -和setTimeout类似,但是每经过一段时间(给定的延时),所传递的函数就会被执行一次,直到这个定时器被注销。 clearInterval(id); , clearTimeout(id); -接受一个计时器ID(由之前两种计时器返回)并且停止计时器回调函数的执行。 为了理解计时器的内部工作原理,我们首先需要了解一个非常重要的概念

异步场景

江枫思渺然 提交于 2020-02-29 16:00:23
假设一个场景: A,B,C,D…等等无数个人需要排队发邮件,邮件数量也不是固定的,会不断的增加 想要给每个人都排个队,A 的单独一个队列发送,B 的单独一个队列发送,C 单独一个队列发送…发完不占用 worker。 换句话说,A 的每次在 worker 中只有一封邮件在发送,发完取 A 的下一封。B,C,D…同理 worker 数等于可以同时处理的人数 目前找到的方案是 celery 的 chain,本来这个队列体系也使用 Celery 的。 但是 chain 只能在任务发起前已经排好队了,我的需求是不断能加到队伍后面。 建个任务接收要发邮件的信息,根据邮件所属人 A,B,C 分别建立一个队列,分别建立一个消费者,设置一个计时器,多久没收到 A 的邮件就将建好的 A 队列删除。 我天性不宜交际。在多数场合,我不是觉得对方乏味,就是害怕对方觉得我乏味。可是我既不愿忍受对方的乏味,也不愿费劲使自己显得有趣,那都太累了。我独处时最轻松,因为我不觉得自己乏味,即使乏味,也自己承受,不累及他人,无需感到不安。 这段话出自周国平《风中的纸屑》。 来源: CSDN 作者: ailinyingai 链接: https://blog.csdn.net/ailinyingai/article/details/104573133

基于任务的异步编程

我是研究僧i 提交于 2020-02-29 04:41:08
博客迁移 记录《Effective C#》学习过程。 任务运行的几种方法 //1.new方式实例化一个Task,需要通过Start方法启动 Task task = new Task(() => { Console.WriteLine($"task1的线程ID为{Thread.CurrentThread.ManagedThreadId}"); }); task.Start(); //2.Task.Factory.StartNew(Action action)创建和启动一个Task Task task2 = Task.Factory.StartNew(() => { Console.WriteLine($"task2的线程ID为{Thread.CurrentThread.ManagedThreadId}"); }); //3.Task.Run(Action action)将任务放在线程池队列,返回并启动一个Task Task task3 = Task.Run(() => { Console.WriteLine($"task3的线程ID为{ Thread.CurrentThread.ManagedThreadId}"); }); View Code 使用异步方法执行异步工作 对于调用异步方法的主调方法来说,只要异步方法已经返回,这里返回的是Task对象,它就可以继续往下执行。

python语法基础-并发编程-进程-进程理论和进程的开启

时间秒杀一切 提交于 2020-02-28 08:18:08
############################################## """ 并发编程的相关概念: 进程 1,运行中的程序,就是进程,程序是没有生命的实体,运行起来了就有生命了, 操作系统可以管理进程,进程是操作系统基本的执行单元, 2,每一个进程都有它自己的地址空间,进程之间是不会混的,比如qq不能访问微信的地址空间, 操作系统替你隔离开了,这也是操作系统引入进程这个概念的原因, ####################################### 进程的调度 1,先来先服务,有一个不好的,就是不利于短作业 2,短作业优先算法,但其对长作业不利;不能保证紧迫性作业(进程)被及时处理;作业的长短只是被估算出来的。 3,时间片轮转算法,就是轮流执行,已经很科学了, 4,多级反馈队列算法,有多个队列,有一个新任务来了放入第一个队列,这是优先级加上时间片轮转,第二个任务来了放入下一级, ####################################### 并发和并行: 进程的并行:这种只有在多核cpu才可以实现, 进程的并发:这是轮流执行,由于速度很快,看起来像是一起执行的,比如一遍听音乐,一遍写代码, ###################################### 进程的三状态转换图:非常重要 1,进程一开始运行的时候

Celery配置实践笔记

那年仲夏 提交于 2020-02-26 04:07:25
说点什么: 整理下工作中配置celery的一些实践,写在这里,一方面是备忘,另外一方面是整理成文档给其他同事使用。 演示用的项目,同时也发布在Github上: https://github.com/blackmatrix7/celery-demo 这份笔记会随着经验的积累,逐步调整完善,不过通常情况下,Github上的更新会比较快。 Celery 配置实践笔记 Celery 配置实践笔记,目前已记录: 异步执行任务 为不同任务分配不同的队列 计划任务 需要补充: 为不同的任务配置不同的优先级 Celey任务的返回结果 创建Celery 配置Celery参数 在创建celery实例之前,需要对celery的参数进行一些配置。 在这里列出一些比较常用的Celery配置项: 配置项名称 说明 CELERY_DEFAULT_QUEUE 默认的队列名称,当没有为task特别指定队列时,采用此队列 CELERY_BROKER_URL 消息代理,用于发布者传递消息给消费者,推荐RabbitMQ CELERY_RESULT_BACKEND 后端,用于存储任务执行结果,推荐redis CELERY_TASK_SERIALIZER 任务的序列化方式 CELERY_RESULT_SERIALIZER 任务执行结果的序列化方式 CELERY_ACCEPT_CONTENT CELERYD

Dart异步与消息循环机制

被刻印的时光 ゝ 提交于 2020-02-25 06:17:14
Dart与消息循环机制 翻译自 https://www.dartlang.org/articles/event-loop/ 异步任务在Dart中随处可见,例如许多库的方法调用都会返回Future对象来实现异步处理,我们也可以注册Handler来响应一些事件,如:鼠标点击事件,I/O流结束和定时器到期。 这篇文章主要介绍了Dart中与异步任务相关的消息循环机制,阅读完这篇文章后相信你可写出更赞的异步执行代码。你也能学习到如何调度Future任务并且预测他们的执行顺序。 在阅读这篇文章之前,你最好先要了解一下基本的 Future用法 。 基本概念 如果你写过一些关于UI的代码,你就应该熟悉消息循环和消息队列。有了他们才能保重UI的绘制操作和一些UI事件,如鼠标点击事件可以被一个一个的执行从而保证UI和UI事件的统一性。 消息循环和消息队列 一个消息循环的职责就是不断从消息队列中取出消息并处理他们直到消息队列为空。 消息队列中的消息可能来自用户输入,文件I/O消息,定时器等。例如下图的消息队列就包含了定时器消息和用户输入消息。 上述的这些概念你可能已经驾轻就熟了,那接下来我们就讨论一下这些概念在Dart中是怎么表现的? Dart的单线程执行 当一个Dart的方法开始执行时,他会一直执行直至达到这个方法的退出点。换句话说Dart的方法是不会被其他Dart代码打断的。 Note