异步队列

java架构之路-(netty专题)netty的基本使用和netty聊天室

淺唱寂寞╮ 提交于 2020-02-14 11:35:59
上次回顾:   上次博客,我们主要说了我们的IO模型,BIO同步阻塞,NIO同步非阻塞,AIO基于NIO二次封装的异步非阻塞,最重要的就是我们的NIO,脑海中应该有NIO的模型图。 Netty概念:   Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 也就是说,Netty 是一个基于NIO的客户、服务器端的编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。 “快速”和“简单”并不用产生维护性或性能上的问题。Netty 是一个吸收了多种协议(包括FTP、SMTP、HTTP等各种二进制文本协议)的实现经验,并经过相当精心设计的项目。最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。---摘自百度百科。 基本使用:   我们来看一下代码吧   服务端: package com.xiaocai.netty; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel

【Android】OkHttp系列(一):发送请求与获取响应流程概述

六眼飞鱼酱① 提交于 2020-02-13 17:38:39
该系列OkHttp源码分析基于 OkHttp3.14.0 版本 文章目录 流程图 配置OkHttpClient 配置请求Request 执行请求 同步请求execute() 异步请求enqueue() 拦截器责任链获取响应结果 流程图 配置OkHttpClient OkHttpClient client = new OkHttpClient . Builder ( ) . addInterceptor ( new TestInterceptor ( ) ) . cache ( new Cache ( getCacheDir ( ) , 1024 ) ) . eventListener ( new OkHttpListener ( ) ) . build ( ) ; OkHttpClient就像配置一个浏览器一样,我们可以指定一些参数,比如超时时间、cookie持久化、代理等等。 使用建造者模式进行配置,基本上所有的配置参数都会有一个默认值,我们只需要针对我们关心的配置进行修改就好了。比如我这里主要进行了一下配置: 添加了一个拦截器 设置了缓存目录以及缓存大小 设置了一个事件监听器,方便我Debug 配置请求Request Request request = new Request . Builder ( ) . url ( "..." ) . get ( ) . header (

Ajax同步异步的区别

本秂侑毒 提交于 2020-02-12 19:36:05
Ajax同步和异步的区别 同步是指一个线程要等待上一个线程执行完才能开始执行,同步可以看做是一个单线程操作;在客户端发出请求后,在服务器没有反馈信息之前,它是一个线程阻塞状态。 . 异步是一个线程在执行中,下一个线程不必等待它执行完就可以开始执行。异步相当于是个多线程。在客户端请求时,可以执行其他线程,并且在把这个线程存放在他的队列里面,有序的执行。异步的效率要高于同步。 如果数据在线程间共享,那么必须使用同步 . . 来源: CSDN 作者: XING_Gou 链接: https://blog.csdn.net/XING_Gou/article/details/104282801

vue批量异步更新策略

筅森魡賤 提交于 2020-02-12 14:31:52
异步更新队列 vue高效的秘诀是一套批量,异步的更新策略 在程序中有好多个组件,每个组件对应一个watch实例,在一次事件循环更新周期内,可能有好多数据发生变化,可能每个组件都会变,这时候最好的方式就是将组件批量的一次更新完之后,浏览器再刷新页面,这时候是最高效的做法 概念 事件循环:浏览器为了协调事件处理、脚本执行、网络请求和渲染等任务而制定的一套工作机制。 宏任务:代表一个个离散的、独立工作单元。 浏览器完成一个宏任务,在下一个宏任务执行开始前,会对页面进行重新渲染 。主要包括创建主文档对象、解析HTML、执行主线JS代码以及各种事件如页面加载、输入、网络事件和定时器等。 微任务:微任务是更小的任务,是在当前宏任务执行结束后立即执行的任务。 如果存在微任务,浏览器会清空微任务之后再重新渲染 。微任务的例子有 promise 回调函数(异步回调函数)、DOM发生变化、watch的update函数等。 总结: 在执行一次宏任务之后,看有没有微任务,有微任务,就清空微任务之后浏览器再刷新页面,没有微任务就直接刷新页面 先做同步任务,再做异步任务,把call stack给清空掉 体验一下 vue中的具体实现 异步:只要侦听到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更。 批量:如果同一个 watcher 被多次触发,只会被推入到队列中一次

js的单线程和异步

泄露秘密 提交于 2020-02-11 06:25:55
引用 :https://www.cnblogs.com/woodyblog/p/6061671.html 前言 说到js的单线程(single threaded)和异步(asynchronous),很多同学不禁会想,这不是自相矛盾么?其实,单线程和异步确实不能同时成为一个语言的特性。js选择了成为单线程的语言,所以它本身不可能是异步的,但js的宿主环境(比如浏览器,Node)是多线程的,宿主环境通过某种方式(事件驱动,下文会讲)使得js具备了异步的属性。往下看,你会发现js的机制是多么的简单高效! 说说浏览器 js是单线程语言,浏览器只分配给js一个主线程,用来执行任务(函数),但一次只能执行一个任务,这些任务形成一个任务队列排队等候执行,但前端的某些任务是非常耗时的,比如网络请求,定时器和事件监听,如果让他们和别的任务一样,都老老实实的排队等待执行的话,执行效率会非常的低,甚至导致页面的假死。所以,浏览器为这些耗时任务开辟了另外的线程,主要包括http请求线程,浏览器定时触发器,浏览器事件触发线程,这些任务是异步的。下图说明了浏览器的主要线程。 图片来自popAnt 画得太好,忍不住引过来 ( http://blog.csdn.net/kfanning/article/details/5768776 ) 再说说任务队列 刚才说到浏览器为网络请求这样的异步任务单独开了一个线程

js的单线程和异步

折月煮酒 提交于 2020-02-11 06:23:18
前言 说到js的单线程(single threaded)和异步(asynchronous),很多同学不禁会想,这不是自相矛盾么?其实,单线程和异步确实不能同时成为一个语言的特性。js选择了成为单线程的语言,所以它本身不可能是异步的,但js的宿主环境(比如浏览器,Node)是多线程的,宿主环境通过某种方式(事件驱动,下文会讲)使得js具备了异步的属性。往下看,你会发现js的机制是多么的简单高效! 说说浏览器 js是单线程语言,浏览器只分配给js一个主线程,用来执行任务(函数),但一次只能执行一个任务,这些任务形成一个任务队列排队等候执行,但前端的某些任务是非常耗时的,比如网络请求,定时器和事件监听,如果让他们和别的任务一样,都老老实实的排队等待执行的话,执行效率会非常的低,甚至导致页面的假死。所以,浏览器为这些耗时任务开辟了另外的线程,主要包括http请求线程,浏览器定时触发器,浏览器事件触发线程,这些任务是异步的。下图说明了浏览器的主要线程。 图片来自popAnt 画得太好,忍不住引过来 ( http://blog.csdn.net/kfanning/article/details/5768776 ) 再说说任务队列 刚才说到浏览器为网络请求这样的异步任务单独开了一个线程,那么问题来了,这些异步任务完成后,主线程怎么知道呢?答案就是回调函数,整个程序是事件驱动的

python语法基础-并发编程-进程-长期维护

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

RocketMQ初步应用架构理论

半城伤御伤魂 提交于 2020-02-09 19:09:49
RocketMQ初步应用架构理论 写给RocketMQ架构应用入门,内容涉及它的设计机理以及推到出来的应用注意事项,入门人员请看。 稍微涉及技术细节,留以我设计中间件时参考,将来整理深度文档时会抽取走,入门人员可以无视。 以下RocketMQ简称为RQ,理论部分采用版本为3.2.4,测试部分采用版本为3.2.6。 MQ的需求 我们对MQ的需求,相比JMS标准有几点要求更高: 1. 必须优美灵活地支持集群消费。 2. 尽量支持消息堆积。 3. 服务高可用性和消息可靠性。 4. 有起码的运维工具做集群管理和服务调整。 其他 提供顺序消息、事务、回溯等面向特别场景的功能更好,目前暂不需要。 RQ架构 RQ的基本组成包括nameserver、broker、producer、consumer四种节点,前两种构成服务端,后两种在客户端上。 还有其他辅助的进程,不提。 NameServer的基本概念 在没有NameServer的中间件中,服务端集群就由干活的broker组成 ,其中的实例分主从两种角色。那么客户端就要知道,需要连接到哪个地址的broker上去做事情,于是客户端就需要配置服务端机器的IP地址,如果服务端部署结构复杂,客户端的配置结构也挺复杂,更讨厌的是甚至可能需要客户端也得更新地址配置。由于有了两种思路的方案: 一是引入NameServer,负责提供地址

node入门

给你一囗甜甜゛ 提交于 2020-02-08 22:48:18
一、基础 运行环境搭建 LTS(Long Term Support) 稳定版 Current 实验版 下载页面: http://nodejs.cn/download/ 命令行输入node -v,查看是否安装成功 JS由三部分组成:ECMAScript、DOM、BOM。 Node.js由ECMAScript及Node环境提供的一些附加API组成的,包括文件、网络、路径等等一些更加强大的API。 ECMAScript语法在Node环境中都可以使用 JS开发弊端 两大问题:文件依赖和命名冲突 Node.js模块化开发 Node.js规定一个JavaScript文件就是一个模块,模块内部定义的变量和函数默认情况下外部无法得到。 模块内部可以使用exports对象进行成员导出,使用require方法导入其他模块。 模块成员导出 exports.version 的version是属性名字,随便起名,等号后的version是上面的变量。 模块成员导入 a接收了exports对象 ./b.js的后缀.js是可以省略掉的 另一种导出方式 exports是module.exports的别名(地址引用关系),导出对象最终以module.exports为准 二、模块化 系统模块 Node运行环境提供的API。因为这些API都是以模块化的方式进行开发的,所以我们又称为Node运行环境的API为系统模块。

Netty权威指南之伪异步I/O编程

微笑、不失礼 提交于 2020-02-07 02:29:44
为了解决同步阻塞I/O一个链路需要一个线程处理问题,对BIO模型做了优化——后端通过一个线程池处理多个客户端的请求接入,设置线程最大值,防止线程并发接入导致的线程耗尽。 当有新的客户端接入时,将客户端Socket封装成一个Task(该任务实现java.lang.Runnable接口)投递到后端的线程池中进行处理,JDK的线程池维护一个消息队列和N个活跃线程,对消息队列中的任务进行处理。由于线程池可以设置消息队列的大小和最大线程数,因此资源占用是可控的,无论多少客户端并发访问都不会导致资源耗尽和宕机。 伪异步I/O通信框架采用了线程池实现,避免了每次请求创建一个独立的线程造成的资源耗尽问题,底层通信依然采用BIO同步阻塞模型,无法从根本上解决问题。当对方发送请求或者应答消息比较缓慢(如数据大),或者网路传输较慢时(网速差)读取输入流一方的通信线程将被长时间阻塞,阻塞期间,其他接入消息只能在消息队列中排队。阻塞结束情况:1)有数据可读,2)可用数据已经读取完毕,3)发生空指针或IO异常 package com.hjp.netty.pseudoasynio; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ExecutorService; import java.util