异步队列

springmvc callable处理异步请求

前提是你 提交于 2019-11-29 00:19:40
使用业务场景 : 对于有的请求业务处理流程可能比较耗时,比如长查询,远程调用等,主线程会被一直占用,而tomcat线程池线程有限,处理量就会下降 servlet3.0以后提供了对异步处理的支持,springmvc封装了异步处理,满足用户请求后,主线程很快结束,并开启其它线程处理任务,并将处理结果响应用户,而主线程就可以接收更多请求。 参考官方解释: https://spring.io/blog/2012/05/07/spring-mvc-3-2-preview-introducing-servlet-3-async-support 原理简介 :对于一次请求,比如front/test 1,springmvc开启副线程处理业务(将Callable 提交到 TaskExecutor) 2, DispatcherServlet 和所有的Filter退出web容器的线程,但是response 保持打开状态 3,Callable返回结果,SpringMVC将请求front/test重新派发给容器(再重新请求一次front/test),恢复之前的处理; 4,DispatcherServlet重新被调用,将结果返回给用户 使用条件 :mvc4.0以上,servlet3.0以上 使用示例 1 import java.util.concurrent.Callable; 2 import java

进程,线程池 ,同步异步

梦想的初衷 提交于 2019-11-28 22:31:15
进程池,线程池 以时间换空间,控制进程,线程开启的数量 进程池与cpu一一对应是并行 线程池是并发:一个容器,这个容器限制住你开启线程(进程)的数量,比如4个,第一次肯定只能变更发的处理4个任务,只要有任务完成,线程马上就会接下一个人任务 以时间换空间,控制进程,线程开启的数量 进程池与cpu一一对应是(并行)或并行加并发 线程池是并发:一个容器,这个容器限制住你开启线程(进程)的数量,比如4个,第一次肯定只能变更发的处理4个任务,只要有任务完成,线程马上就会接下一个人任务 以时间换空间 from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor def fun(): print(1) t=ThreadPoolExecutor()#实例化一个进程池对象 t.submit(fun)#用submit开启一个进程池 基于线程池的服务端 from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor import socket import os import time import random def communicate(conn, addr): while 1: # # try: from_client_data = conn

Swoole进程模型

北城余情 提交于 2019-11-28 19:59:45
进程 什么是进程 进程 Process 是计算机中的程序关于某数据集合上的一次运行活动,是系统分配资源和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体。在当代面向线程设计的计算机结构中,进程是线程的容器。简单来说,程序是指令、数据以及其组织形式的描述,而进程则是程序的实体。 在操作系统中,进程表示正在运行的程序,例如在终端中使用PHP命令运行PHP脚本,此时就相当于创建了一个进程,这个进程会在系统中驻存,申请属于它自己的内存空间和系统资源,并且运行相应的程序。 $ php build.php <?php //获取当前进程的PID echo posix_getpid(); //修改所在进程的名称 swoole_set_process_name("swoole process master"); //模拟持续运行100秒的程序 sleep(100);//持续运行100秒的目的是为了在进程中可以查看而不至于很快结束 运行程序 $ php build.php 71 查看进程 $ ps aux | grep 71 root 1 0.0 0.1 18188 1712 pts/0 Ss+ 11:07 0:00 /bin/bash root 71 0.0 3.0 340468 30788 pts/2 S+ 13:41 0:00 swoole

JS异步编程

江枫思渺然 提交于 2019-11-28 19:27:35
1.1 什么是异步 异步(async) 是相对于 同步(sync) 而言的,很好理解。 同步 就是一件事一件事的执行。只有前一个任务执行完毕,才能执行后一个任务。而 异步是不用等待前一个任务执行完成也能够执行 比如: setTimeout(function(){ console.log(1); }, 1000); console.log(2);// 2 1 setTimeout就是一个 异步任务 ,当JS引擎顺序执行到setTimeout的时候发现他是个异步任务,则会把这个任务挂起,继续执行后面的代码。直到1000ms后,回调函数才会执行,这就是异步,在执行到setTimeout的时候,JS并不会傻呵呵的等着1000ms执行cbFn回调函数,而是继续执行了后面的代码。所以执行结果是:2 1 1.2 为啥要在JS中使用异步 由于javascript是 单线程 的,只能在JS引擎的主线程上运行的,所以js代码只能一行一行的执行,不能在同一时间执行多个js代码任务,这就导致如果有一段耗时较长的计算,或者是一个ajax请求等IO操作,如果没有异步的存在,就会出现用户长时间等待,并且由于当前任务还未完成,所以这时候所有的其他操作都会无响应。 1.3 那为啥JS不设计成多线程的 这主要跟javascript的历史有关,js最开始只是为了处理一些表单验证和DOM操作而被创造出来的

Windows内核原理-同步IO与异步IO

为君一笑 提交于 2019-11-28 18:48:30
目录 Windows内核原理-同步IO与异步IO 背景 目的 I/O 同步I/O 异步I/O I/O完成通知 总结 参考文档 Windows内核原理-同步IO与异步IO 背景 在前段时间检查 异常连接导致的内存泄漏排查 的过程中,主要涉及到了windows异步I/O相关的知识,看了许多包括重叠I/O、完成端口、IRP、设备驱动程序等Windows下I/O相关的知识,虽然学习到了很多东西,但是仍然需要自顶而下的将所有知识进行梳理。 目的 本片文章主要讲解同步I/O与异步I/O相关知识,希望通过编写本篇文章为起点,对windows内核原理知识进行学习与梳理。发现并弥补遗漏的知识点并加以学习。同时通过理解windows内核原理,设计出更好、更合理的应用程序。 I/O I/O即输入输出。在现在操作系统,输入输出是计算机完整功能必不可少的一部分。处理器负责各种计算任务,然后通过各种输入输出设备与外界进行交互。常见的输入输出设备包括键盘、鼠标、显示器、硬盘、网络适配器接口等。有了硬件设备,在软件层面上,使得操作系统通过以一致的方式与设备驱动交互从而的操控硬件设备。而应用程序通过统一的接口与系统内核进行交互。 Windows从一开始就设计了可扩展的I/O接口。在应用层通过统一的 Win32 API ,将I/O请求分配给正确的设备驱动程序。设备驱动程序调用设备控制器来操控硬件

event loop一篇文章足矣

自闭症网瘾萝莉.ら 提交于 2019-11-28 15:03:32
event loop 浏览器内核是多线程, Javascript 是单线程。 楼主之前讲解了 js 的异步处理,只是讲解了异步处理的方法,但是对于异步处理的原理还是不是很了解,这篇文章是对于浏览器的线程方面对 JavaScript 的运行机制进行分析。 1:浏览器基本 我们经常说, js 的执行环境是一个单线程,会按顺序执行代码,但是 JavaScript 又是可以异步,这两者感觉有冲突,但是本质上,如果理解浏览器的事件循环机制(event loop),就会觉得并不冲突。 浏览器里面不仅只有解释 JavaScript 的引擎,还包括很多其它的引擎。 浏览器机制.png 浏览器主要包括: 用户界面:包括地址栏、前进/后退按钮、书签菜单等。除了浏览器主窗口显示的您请求的页面外,其他显示的各个部分都属于用户界面。 浏览器引擎(浏览器内核): 在用户界面和呈现引擎之间传送指令。 呈现引擎 - 负责显示请求的内容。如果请求的内容是 HTML,它就负责解析 HTML 和 CSS 内容,并将解析后的内容显示在屏幕上。 网络 - 用于网络调用,比如 HTTP 请求。其接口与平台无关,并为所有平台提供底层实现。 用户界面后端 - 用于绘制基本的窗口小部件,比如组合框和窗口。其公开了与平台无关的通用接口,而在底层使用操作系统的用户界面方法。 JavaScript 解释器。用于解析和执行

【并发编程必备基础之进程】

本秂侑毒 提交于 2019-11-28 14:58:56
原文: http://blog.gqylpy.com/gqy/236 目录 1.操作系统背景知识 2.什么是进程 3.进程调度 4.进程的并行与并发 5.同步异步阻塞非阻塞 6.进程的创建与结束 1.操作系统背景知识 顾名思义 ,进程即正在执行的一个过程,进程是对正在运行的程序的一个抽象。进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老的最重要的抽象概念之一,操作系统的其他所有内容都是围绕进程的概念展开的。 所以想要真正了解进程,应先了解操作系统, 点击进入操作系统介绍 PS:即使可以利用的cpu只有一个(早期的计算机确实如此),也能保证支持(伪)并发的能力。将一个单独的cpu变成多个虚拟的cpu(多道技术:时间多路复用+空间多路复用+硬件上支持分离),如果没有进程的抽象,现代计算机将不复存在。 必备理论基础 1.操作系统的作用: 1)隐藏复杂的硬件接口,提供良好的抽象接口. 2)管理,调度进程,并且将多个进程对硬件的抢夺变得有序 2.多道技术 1)产生背景:针对单核,实现并发 2)空间上的复用:如内存中同时有多道程序 3)时间上的复用:复用一个cpu的时间片,强调:遇到io切,占用cpu的时间过长也切,核心在于切之前将进程的状态保存下载,这样才能保证下次切换回来时能基于上次切走的位置继续运行. PS:现在的cpu一般都是多核的,同样

【前端知识体系-NodeJS相关】NodeJS高频前端面试题整理

为君一笑 提交于 2019-11-28 14:47:16
1. 为什么JavaScript是单线程? 防止DOM渲染冲突的问题; Html5中的Web Worker可以实现多线程 2.什么是任务队列? 任务队列"是一个先进先出的数据结构,排在前面的事件,优先被主线程读取。主线程的读取过程基本上是自动的,只要执行栈一清空,"任务队列"上第一位的事件就自动进入主线程。 2.1 同步和异步任务 同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务; 异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。 2.2 执行流程 所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。 主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。 一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。 主线程不断重复上面的第三步。 3. 什么是事件循环(EventLoop)? 主线程从"任务队列"中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)。 3.1 定时器函数的基本使用方法对比?

Swoole引擎原理的快速入门干货

◇◆丶佛笑我妖孽 提交于 2019-11-28 14:41:05
更多内容,欢迎关注微信公众号:全菜工程师小辉~ 过去一年使用PHP和Java两种技术栈完成了一个游戏服务器项目。由于项目中有高频的网络请求,所以PHP技术栈尝试使用Swoole引擎(基于事件的高性能异步并行网络通信引擎)来完成部分游戏业务。 Swoole的安装 安装swoole很简单,由于是国人做的项目,很多issue可以在 官网 文档找到答案。安装分两种: 编译安装。直接去github或者gitee去下载官方的发行版,编译安装后,将so拓展写入php.ini文件。 容器安装。swoole引擎应用广泛,所以hub上有很多可用的容器,选择需要的pull一下即可。 具体操作百度一下即可,网上相关内容很多。 Swoole引擎的优势 常驻内存。传统 PHP框架或者单文件,在处理每个请求之前,都要做一遍加载框架文件、配置的操作,请求完成之后会释放所有资源和内存,无须担心内存泄漏。但是如果请求数量上升,并发很高的时候,快速创建资源,又马上释放,会导致 PHP 程序运行效率急剧下降。而使用 Swoole 则没有这个问题:PHP的代码加载到内存后,拥有更长的生命周期,这样建立的数据库连接和其他大的对象,不被释放。每次请求只需要处理很少的代码,而这些代码只在第一次运行时,被 PHP 解析器编译,驻留内存。以后都是直接载入 OPCODE ,让 Zend 引擎直接运行。另外,之前PHP不能实现的

python - 进程

流过昼夜 提交于 2019-11-28 11:29:47
一,理论知识 1,什么是进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动, 是系统进行资源分配和调度的基本单位 ,是 操作系统 结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是 操作系统 动态执行的 基本单元 ,在传统的 操作系统 中,进程既是基本的 分配单元 ,也是基本的执行单元。 第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。 第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。[3] 进程是操作系统中最基本、重要的概念。是多道程序系统出现后