异步

异步任务神器 Celery 简明笔记

孤街醉人 提交于 2019-12-03 16:25:56
在程序的运行过程中,我们经常会碰到一些耗时耗资源的操作,为了避免它们阻塞主程序的运行,我们经常会采用多线程或异步任务。比如,在 Web 开发中,对新用户的注册,我们通常会给他发一封激活邮件,而发邮件是个 IO 阻塞式任务,如果直接把它放到应用当中,就需要等邮件发出去之后才能进行下一步操作,此时用户只能等待再等待。更好的方式是在业务逻辑中触发一个发邮件的异步任务,而主程序可以继续往下运行。 Celery 是一个强大的分布式任务队列,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行。我们通常使用它来实现异步任务(async task)和定时任务(crontab)。它的架构组成如下图: 可以看到,Celery 主要包含以下几个模块: 任务模块 Task包含异步任务和定时任务。其中,异步任务通常在业务逻辑中被触发并发往任务队列,而定时任务由 Celery Beat 进程周期性地将任务发往任务队列。 消息中间件 BrokerBroker,即为任务调度队列,接收任务生产者发来的消息(即任务),将任务存入队列。Celery 本身不提供队列服务,官方推荐使用 RabbitMQ 和 Redis 等。 任务执行单元 WorkerWorker 是执行任务的处理单元,它实时监控消息队列,获取队列中调度的任务,并执行它。 任务结果存储 BackendBackend 用于存储任务的执行结果

并发 并行 同步 异步 多线程的区别

浪子不回头ぞ 提交于 2019-12-03 14:19:47
1. 并发:在 操作系统 中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个 处理机 上运行。其中两种并发关系分别是同步和互斥 2. 互斥:进程间相互排斥的使用临界资源的现象,就叫互斥。 3. 同步:进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。进一步的说明:就是前一个进程的输出作为后一个进程的输入,当第一个进程没有输出时第二个进程必须等待。具有同步关系的一组并发进程相互发送的信息称为消息或事件。 其中并发又有伪并发和真并发,伪并发是指单核处理器的并发,真并发是指多核处理器的并发。 4. 并行:在单处理器中多道程序设计系统中,进程被交替执行,表现出一种并发的外部特种;在多处理器系统中,进程不仅可以交替执行,而且可以重叠执行。在多处理器上的程序才可实现并行处理。从而可知,并行是针对多处理器而言的。并行是同时发生的多个并发事件,具有并发的含义,但并发不一定并行,也亦是说并发事件之间不一定要同一时刻发生。 5. 多线程:多线程是程序设计的逻辑层概念,它是进程中并发运行的一段代码。多线程可以实现线程间的切换执行。 6. 异步:异步和同步是相对的,同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。线程就是实现异步的一个方式

nodejs的C++扩展中实现异步回调

断了今生、忘了曾经 提交于 2019-12-03 10:21:38
在nodejs的官方网站中有关于C++扩展的详细说明,其中包含了从"hello world"到对象封装的一系列示例。其中的“ callback ”节是关于回调函数的,美中不足的是,这个回调是阻塞的回调。 官方示例的回调函数用JS代码来模拟的话,大致是这个样子: function syncCallback(callback) { // 业务代码 // 业务代码 callback(); } 使用C++扩展的一个最大好处就是处理一些CPU密集的业务,因此这部分代码一定是比较耗时的,否则用C++去实现完全没有意义。业务代码中的阻塞操作,例如传统文件读写、密集计算等都会导致nodejs原始线程的阻塞,导致后来的请求无法得到及时响应,严重影响node的并发性能。 有服务器程序开发的朋友肯定已经想到用多线程的方法解决这个问题。是的,我要分享的就是在C++扩展中用多线程的方法处理回调,从而达到解决复杂的业务同时保证node线程的无阻塞特性。 node C++扩展中,可以使用libuv提供的线程方法,非常方便的进行线程调度。 下面是具体代码,详细解释见注释: #include <v8.h> #include <node.h> #include <stdlib.h> #include <errno.h> #include <stdio.h> #include <string.h> using

【完全跨域】异步上传文件并获得返回值

◇◆丶佛笑我妖孽 提交于 2019-12-03 02:52:57
【完全跨域】异步上传文件并获得返回值 作者:php-note.com 发布于:2015-03-01 10:58 分类:JS/jQuery 浏览(595) AJAX可以进行数据的异步请求,但对于文件和跨域问题却束手无策。 Jsonp可以进行跨域数据的异步请求,但同样不能使用于文件。 <form>表单可以进行跨域数据和文件的上传,但却会使页面跳转。 那么如何同时实现“异步”+“跨域”+“文件”+“返回值”这几个特性呢?方法如下: 原理: 将<form>表单通过一个iframe来submit,也就是将<form>的target属性设置为一个iframe的id,这样<form>的action URL就会在这个iframe中打开,那么服务器的返回数据也就会输出到iframe中了。最后再通过主页面与iframe之间的交互完成对返回数据的读取(这涉及到跨域问题,文章后面将介绍此问题的解决方法)。 基本结构: 前端部分(当前域名:www.test.com,与form中的action域名相同) 1 <form action="http://www.test.com/io.php" method="POST" enctype="multipart/form-data" target="upload"> 2 3 <input type="file" name="upload_file" /> 4 5

服务器高并发设计模式

旧街凉风 提交于 2019-12-03 01:39:49
半同步/半异步模式 先解释一下同步和异步的区别,与刚才I/O的同步、异步不一样,在并发模式中,这里的“同步"指的是程序完全按照代码的顺序执行,“异步”指的是程序的执行需要由系统事件来驱动,比如说信号、中断等。下图就清楚的解释了同步和异步操作的过程: 这样看来,显然 异步线程的执行效率高,但是它的编写相对复杂,难于调试 ,然而 同步线程刚好相反,逻辑简单,但效率较差 。半同步/半异步模式就结合了同步线程与异步线程的优点, 它在处理I/O事件时使用异步线程,处理客户逻辑则使用同步线程 。这样既满足了客户连接的实时性,又能同时处理多个连接。那么它是如何同将同步与异步结合起来的?实现半同步/半异步模式需要三个模块: 异步处理模块、同步处理模块和队列模块 。 举个例子: "一家律师事务所有一个前台接待员,每一位想寻找律师的客户,都会先由接待员接待,接待员会给每位顾客都安排一个律师来处理客户的案件,(假设一个律师在同一时间只能处理一个客户的案子)接待员只有一个人,但他可以接待所有客户,不过它也只负责接待,哪怕你的案件再复杂,都是律师的事儿,跟接待员没关系,而分配的依据可以是预约情况或者案件类型。" 在上面这个例子中,那个前台接待员就是异步处理模块,他一个人要处理多个I/O请求(客户),律师则是同步处理模块,每一个律师分别对应一个客户,根据客户的不同需求作出处理,而要让异步模块与同步模块连接起来

Generator函数

匿名 (未验证) 提交于 2019-12-03 00:40:02
Generator 函数是 ES6 提供的一种异步编程解决方案。 1、所谓“异步”,简单说就是一个任务分成两段,先执行第一段,然后转而执行其他任务,等做好了准备,再回过头执行第二段。 2、异步编程方式: ( 1 )回调函数 ( 2 )事件监听 ( 3 )发布/订阅者 ( 4 ) Promise 对象 3、所谓回调函数,就是把第二段单独写在一个函数里面,等到重新执行这个任务的时候,就直接调用这个函数。 回调函数的异步方式容易形成多重嵌套,多个异步操作形成了强耦合,只要有一个操作需要修改,它的上层回调函数和下层回调函数,可能都要跟着修改。这种情况就称为”回调函数地狱”(callback hell)。 Promise可以解决callback hell问题,Promise对象允许回调函数的嵌套,改成链式调用。 二、什么是Generator? 语法上,可以把理解成,Generator 函数是一个状态机,封装了多个内部状态。 形式上,Generator 函数是一个普通函数。 整个Generator函数就是一个封装的异步任务,或者说是异步任务的容器,异步操作需要暂停的地方,都用yield语句。 Generator函数特征: (1)function 关键字和函数之间有一个星号(*),且内部使用yield表达式,定义不同的内部状态。 (2)调用Generator函数后,该函数并不执行

ajax异步请求,session超时处理

吃可爱长大的小学妹 提交于 2019-12-02 22:37:45
在web开发中,通常会有session超时处理,对于普通的http请求比较容易处理,而对于ajax异步请求,可能就需要特殊处理了 /* 服务器端:拦截器或过滤器处理:*/ // 异步请求session超时的处理 if (request.getHeader("x-requested-with") != null && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) { PrintWriter wirter = response.getWriter(); wirter.write("timeout"); wirter.flush(); } else { // 普通http请求session超时的处理 return Action.LOGIN; } /* 浏览器端:JQuery添加全局AJAX默认选项:complete回调函数:*/ $.ajaxSetup({ global: false, type: "POST", complete: function (XMLHttpRequest, textStatus) { var data = XMLHttpRequest.responseText; if (data == "timeout") { if( window.top != window

Servlet 3.0 实战:异步 Servlet 与 Comet 风格应用程序

会有一股神秘感。 提交于 2019-12-01 17:18:33
概述 作为 Java EE 6 体系中重要成员的 JSR 315 规范,将 Servlet API 最新的版本从 2.5 提升到了 3.0,这是近 10 年来 Servlet 版本号最大的一次升级,此次升级中引入了若干项令开发人员兴奋的特性,如: 可插拔的 Web 架构(Web framework pluggability)。 通过 Annotations 代替传统 web.xml 配置文件的 EOD 易于开发特性(ease of development)。 Serlvet 异步处理支持。 安全性提升,如 Http Only Cookies、login/logout 机制。 其它改进,如文件上传的直接支持等。 其中,在开源社区中讨论得最多的就是 Servlet 异步处理的支持,所谓 Servlet 异步处理,包括了非阻塞的输入/输出、异步事件通知、延迟 request 处理以及延迟 response 输出等几种特性。这些特性大多并非 JSR 315 规范首次提出,譬如非阻塞输入/输出,在 Tomcat 6.0 中就提供了 Advanced NIO 技术以便一个 Servlet 线程能处理多个 Http Request,Jetty、GlassFish 也曾经有过类似的支持。但是使用这些 Web 容器提供的高级特性时,因为现有的 Servlet API 没有对这类应用的支持

Servlet3.0提供的异步处理

瘦欲@ 提交于 2019-11-30 17:57:36
在以前的Servlet规范中,如果Servlet作为控制器调用了一个耗时的业务方法,那么Servlet必须等到业务方法完全返回之后才会生成响应,这将使得Servlet对业务方法的调用变成一种阻塞式的调用,因此效率比较低。Servlet3.0规范引入了异步处理来解决这个问题,异步处理允许Servlet重新发起一条线程去调用耗时的业务方法,这样就可以避免等待。 Servlet3.0的异步处理是通过AsyncContext类来处理的,Servlet可通过ServletRequest的如下两个方法来开启异步调用、创建AsyncContext对象: AsyncContext startAsync() AsyncContext startAsync(ServletRequest, ServletResponse) 重复调用上面的方法将得到同一个AsyncContext对象。AsyncContext对象代表异步处理的上下文,它提供了一些工具方法,可完成设置异步调用的超时时长,dispatch用于请求、启动后台线程、获取request,response对象等功能,下面是一个进行异步处理的Servlet类: @WebServlet(urlPatterns="/async", asyncSupported=true) public class AsyncServlet extends

聊一聊前端模板与渲染那些事儿

我与影子孤独终老i 提交于 2019-11-30 00:12:06
欢迎大家收看聊一聊系列,这一套系列文章,可以帮助前端工程师们了解前端的方方面面(不仅仅是代码): http://my.oschina.net/MrHou/blog?catalog=477313&temp=1466755903794 1 页面级的渲染 再刚有web的时候,前端与后端的交互,非常直白,浏览器端发出URL,后端返回一张拼好了的HTML串。浏览器对其进行渲染。html中可能会混有一些php(或者php中混有一些html)。在服务端将数据与模板进行拼装,生成要返回浏览器端的html串。 这与我们现在做一个普通网页没什么区别。只不过现在,我们更常使用模板技术来解决前后端耦合的问题。 前端使用模板引擎,在html中写一些标签,与数据与逻辑基本无关。后端在渲染的时候,解析这些标签,生成HTML串,如smarty。其实前端与后端的交互在服务端就已经有一次了。 模板: front.tpl <div> {%$a%} </div> 后端: // 设置变量 $smarty->assign('a', 'give data'); // 展示模板 $smarty->display("front.tpl"); 到前端时是渲染好的html串: <div> give data </div> 这种方式的特点是展示数据快,直接后端拼装好数据与模板,展现到用户面前。 2 异步的请求与新增模板 新的时代