异步队列

GCD串行,GCD并行,GCD同步与异步,

随声附和 提交于 2020-02-25 03:34:44
1. GCD 简介   什么是 GCD 呢???   哈哈,啰嗦一下,想直接看代码的可以直接看第4条   答曰:Grand Central Dispatch(GCD) 是 Apple 开发的一个多核编程的较新的解决方法。 它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。它是一个在线程池模式的基础上执行的并发任务。 在 Mac OS X 10.6 雪豹中首次推出,也可在 iOS 4 及以上版本使用。   GCD是一个替代诸如NSThread等技术的很高效和强大的技术。GCD完全可以处理诸如数据锁定和资源泄漏等复杂的异步编程问题。 GCD的工作原理是让一个程序,根据可用的处理资源,安排他们在任何可用的处理器核心上平行排队执行特定的任务。这个任务可以是 一个功能或者一个程序段。 ↑ 来自百科( 我是百科链接 ) 好吧,但他有什么用呢? GCD 会自动管理线程的生命周期(创建线程、调度任务、销毁线程) 程序员只需要告诉 GCD 想要执行什么任务,不需要编写任何线程管理代码 GCD 可用于多核的并行运算 等    2. GCD 任务和队列 GCD两个核心的概念:任务和队列 任务:    就是执行操作的意思,就是你在线程中执行的那段代码,在 GCD 中是放在 block 中的。   执行任务有两种方式:同步执行(sync)和异步执行(async)。   两者的主要区别是

GCD同步异步 串行并行大解析

倖福魔咒の 提交于 2020-02-25 03:33:34
/** 核心概念 任务:block里需要执行的操作 队列:把任务添加进入队列中,按照先进先出的原则来执行任务 串行队列:一个一个的执行 并行队列:可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)并发功能只有在异步(dispatch_async)函数下才有效。 同步任务:不会开辟新的线程,任务在当前的线程中执行,同时任务是立刻执行 异步任务:会开辟新的线程(主队列不可以),任务在新开辟的线程执行(主队列在主线程中执行),不是立刻 执行任务 同步任务串行队列:不会开启新的线程,当前的线程中顺序执行任务 同步任务并行队列:不会开启新的线程,当前的线程中执行任务,立刻执行任务 异步任务串行队列:会开辟一个新的线程,在新开辟的线程中执行任务,不是立刻执行 异步任务并行队列:会开辟新的线程,在新开辟的线程中执行任务,任务的完成顺序是无序的,不是立刻执行 主队列(特殊的串行队列):任务只会在主线程中调度,不会开辟新的线程(一般用于刷新UI) 异步任务主队列:不会开辟新的线程,当前的线程中执行任务,不会立刻执行任务 同步任务主队列:死锁 全局队列(并行队列):全局队列供给应用程序共享,可以设置优先级 开辟新的线程:由任务决定,同步任务不会开辟新的线程,异步任务会开辟新的线程(主队列不会开辟新的线程) 开辟多少线程:由队列决定,串行队列只会开启一个线程,并行队列会开辟多个线程

C#后台异步消息队列实现

别说谁变了你拦得住时间么 提交于 2020-02-24 18:21:58
简介 基于生产者消费者模式,我们可以开发出线程安全的异步消息队列。 知识储备 什么是生产者消费者模式? 为了方便理解,我们暂时将它理解为垃圾的产生到结束的过程。 简单来说,多住户产生垃圾(生产者)将垃圾投递到全小区唯一一个垃圾桶(单队列),环卫将垃圾桶中的垃圾进行处理(消费者)。就是一个生产者消费者模式。 这种模式的好处,就不在这里叙述了,毕竟这篇文章不是在讲设计模式。有兴趣的小伙伴可以自行了解一下。 应用场景 很多时候,我们有一些不紧急但却对操作顺序有强依赖的需求。 比如,12306候补抢票。(并不代表真的是这种模式,为了举例方便理解) 当用户提交候补请求时即生产出一条消息,入队一个消息队列中,只要有人退票,就在队列中出队一个用户的消息。由于队列的性质是先进先出的,利用这种性质我们就可以实现公平的候补机制。 今天先写到这里。 来源: https://www.cnblogs.com/dcxy/archive/2020/02/24/12357477.html

消息队列面试大全

北慕城南 提交于 2020-02-24 05:05:22
文章目录 消息队列引入 你在项目种使用过消息队列么?公司使用什么消息架构 消息队列和异步调用的区别 那些业务场景使用了消息队列 消息队列的优点 消息中间件的缺点 Kafka概述 简述kafka架构下的重要关键字 为什么要选择kafka kafka和rabbitMQ区别 分布式构建三把斧:缓存+异步+数据分组 支付状态:未支付,支付成功,支付失败,待退款,已退款 快递状态:代发货,待收货,已收货,退货-商家待收货,退货-商家已收货 订单状态:订单打开,订单取消,订单关闭,订单完成 消息队列引入 Http请求适用于 耗费数百毫秒或更少时间 执行任务,当业务耗时达到一两秒种或更长时,需要。 例如 下单送积分,下单是最主要的,送积分可以异步去做 订单支付成功短信通知,返回支付订单进入下一环节更重要,短信通知可以异步执行 订单系统的日志收集功能 你在项目种使用过消息队列么?公司使用什么消息架构 ActiveMq: 分发效率最高,是其他队列的几十倍,缺点是不能做数据持久化 RabbitMQ:使用Erlang语言开发的开源消息队列,基于AMQP协议实现,支持消息的可靠传输,支持事务,不支持批量操作。 Kafka:最初由领英开发,以可水平扩展和高吞吐率被广泛使用,同等硬件Kafka性能超过传统的消息中间件,我们公司使用的消息队列中间件就是Kafka搭建的。 消息队列和异步调用的区别

JAVA BIO与NIO、AIO的区别

别说谁变了你拦得住时间么 提交于 2020-02-21 08:33:27
IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 一、BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒绝请求,如果有的话,客户端会线程会等待请求结束后才继续执行。 二、NIO NIO本身是基于事件驱动思想来完成的,其主要想解决的是BIO的大并发问题: 在使用同步I/O的网络应用中,如果要同时处理多个客户端请求,或是在客户端要同时和多个服务器进行通讯,就必须使用多线程来处理。也就是说,将每一个客户端请求分配给一个线程来单独处理。这样做虽然可以达到我们的要求,但同时又会带来另外一个问题。由于每创建一个线程,就要为这个线程分配一定的内存空间(也叫工作存储器),而且操作系统本身也对线程的总数有一定的限制。如果客户端的请求过多,服务端程序可能会因为不堪重负而拒绝客户端的请求,甚至服务器可能会因此而瘫痪。 NIO基于Reactor,当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理,应用再将流读取到缓冲区或写入操作系统。 也就是说,这个时候,已经不是一个连接就要对应一个处理线程了

深入理解 JavaScript 事件循环(一)— event loop

限于喜欢 提交于 2020-02-18 22:04:56
引言   相信所有学过 JavaScript 都知道它是一门单线程的语言,这也就意味着 JS 无法进行多线程编程,但是 JS 当中却有着无处不在的 异步 概念 。在初期许多人会把异步理解成类似多线程的编程模式,其实他们中有着很大的差别,要完全理解异步,就需要了解 JS 的运行核心—— 事件循环(event loop) 。在之前我对事件循环的认识也是一知半解的,直到我看了 Philip Roberts 的演讲 What the heck is the event loop anyway? ,我才对事件循环有了一个全面的认识,所以我想写一篇介绍 JS 事件循环的文章,以供大家学习和参考。 一、为什么会有异步?   为什么 JS 当中会有异步?我们想象一下,如果我们同步的执行一下代码会发生什么: 1 $.get(url, function(data) { 2 //do something 3 });   在我们使用 ajax 进行通信的时候,我们都默认了它是异步的,但是如果我们设置其为同步执行,会发生什么?如果你自己写一个小的测试程序,将后台代码延迟5s你会发现浏览器会出现阻塞,直到 ajax 响应了之后才会正常运行。这便是异步模式要解决的首要问题,如何使浏览器非阻塞的运行任务。想象一下如果我们同步的执行 ajax 请求的话,我们的等待的时间是一个未知数,在网络通信中可能很快也可能很慢

js 异步实现与编程

点点圈 提交于 2020-02-18 21:28:22
同步 同步 同步是代码从上到下依次执行,上一个任务结束后,才能执行下一个任务。 如下图所示,任务1执行完后,再执行任务2,任务2执行完后再执行任务3,依次类推... 同步优势 同步是任务有序进行,不会造成资源上处理上的混乱。 1.任务有序进行较好的处理了任务之间的依赖性,如后一个任务需要前一个任务的结果。 2.如果多个任务处理同一个资源,不会造成资源处理的混乱。 var a = 1; function task1(){   console.log(a);   for(var i = 0; i <10000;i++){     a++; }   console.log(a); } function task2(){   console.log(a);   for(var i = 0; i <10000;i++){     a--; }   console.log(a); } task1(); task2(); task1、task2都操作变量a。先执行task1, 执行完 task1后得到一个a的结果值。然后task2处理task1处理的结果值。 如果task1与task2不是同步的,task1没有执行完,去执行task2,task2执行一会,再去执行task1,... ,可能a的值都不是task1、 task2想要的结果。 同步弊端 同步上从上到下依次执行的,必须等到上个任务完成

BIO、NIO、AIO

可紊 提交于 2020-02-18 20:11:06
IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 一、BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒绝请求,如果有的话,客户端会线程会等待请求结束后才继续执行。 二、NIO NIO本身是基于事件驱动思想来完成的,其主要想解决的是BIO的大并发问题: 在使用同步I/O的网络应用中,如果要同时处理多个客户端请求,或是在客户端要同时和多个服务器进行通讯,就必须使用多线程来处理。也就是说,将每一个客户端请求分配给一个线程来单独处理。这样做虽然可以达到我们的要求,但同时又会带来另外一个问题。由于每创建一个线程,就要为这个线程分配一定的内存空间(也叫工作存储器),而且操作系统本身也对线程的总数有一定的限制。如果客户端的请求过多,服务端程序可能会因为不堪重负而拒绝客户端的请求,甚至服务器可能会因此而瘫痪。 NIO基于Reactor,当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理,应用再将流读取到缓冲区或写入操作系统。 也就是说,这个时候,已经不是一个连接就要对应一个处理线程了

JavaScript运行机制

删除回忆录丶 提交于 2020-02-18 15:14:03
一、引子 本文介绍JavaScript运行机制,这一部分比较抽象,我们先从一道面试题入手: 这一题看似很简单,但如果你不了解JavaScript运行机制,很容易就答错了。题目的答案是依次输出1 2 3,如果你有疑惑,下文有详细解释。 二、理解JS的单线程的概念 JavaScript语言的一大特点就是单线程,也就是说, 同一个时间只能做一件事 。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。 JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。 三、理解任务队列(消息队列) 单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。JavaScript语言的设计者意识到这个问题,将所有任务分成两种, 一种是同步任务(synchronous),另一种是异步任务(asynchronous) 。同步任务指的是,在主线程上排队执行的任务

js中异步和同步的区别

时光怂恿深爱的人放手 提交于 2020-02-16 10:38:21
执行环境 :js的执行环境是单线程的,它一次只能执行一个任务,按照主线程里执行栈里任务的排列来执行。 同步任务 :是按照主线程里执行栈里任务的排列来执行的。 异步任务 :遇到异步任务,先不放入主线程,因为异步任务不知道什么时候才能获取结果,这样会影响页面正常显示。当异步任务执行后,进入阻塞状态,主线程会继续向下执行代码,当异步任务执行完成,把对应的回调函数封装成事件放入任务队列中,当主线程里的任务执行完毕,才去任务队列中找事件中的回调函数来执行,这些事件的回调函数都执行完后,相当于完成了一次事件循环。 同步和异步的区别 :同步会阻塞后续代码的执行,异步不会阻塞后续代码的执行。 前端会用到异步的地方 : 1.setInterval 、 setTimeout setInterval ( function ( ) { console . log ( "a" ) } , 3000 ) / / 每隔3秒会把回调函数封装成事件放入任务队列中 2.ajax请求 $ . get ( "./data.json" , ( data ) => { console . log ( data ) } ) / / 当请求完成把回调函数封装成事件放入任务队列中 3.事件绑定 document . getElementById ( "btn" ) . addEventListener ( "click" ,