异步

Python 开源异步并发框架的未来(转)

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-26 18:41:47
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Python 开源异步并发框架的未来 fantix 1.1k 2014年04月16日 发布 推荐 4 推荐 收藏 31 收藏, 8.9k 浏览 呵呵,这个标题有点大,其实只是想从零开始介绍一下异步的基础,以及 Python 开源异步并发框架的发展和互操作性。 另外,这是我在 OSTC 2014 做的一个 20140330-OSTC-分论坛1王川 http://v.youku.com/v_show/id_XNjk2ODI0ODQ4.html ,幻灯片在 这里 ,欢迎拍砖。 开源 Python 是开源的,介绍的这几个框架 Twisted 、 Tornado 、 Gevent 和 tulip 也都是开源的,最后这个演讲是在开源大会弄的,所以标题里肯定少不了开源。另外,我的 gevent3 项目也是开源的——貌似不少同学被我起的极品名字给搞混了,特别说明一下, gevent3 虽然有跟 Gevent 一样的接口外貌,但底层却是 tulip 驱动的(考虑把名字改回 gulip 之类的);请区别于将来会支持 Python 3 的 Gevent 1.1。 非阻塞 先上一段代码。请原谅我用 Python 代码充当伪代码了,但 Python 的语法实在是太简单了,忍不住啊。 import sockets = socket

究竟什么是异步编程?

三世轮回 提交于 2019-12-25 18:54:39
  在我们的工作和学习当中,到处充满了异步的身影,到底什么是异步,什么是异步编程,为什么要用异步编程,以及经典的异步编程有哪些,在工作中的场景又有什么,我们一点点深入的去学习。   什么是异步编程?   有必要了解一下,什么是异步编程,为什么要异步编程。   先说一个概念异步与同步。介绍异步之前,回顾一下,所谓同步编程,就是计算机一行一行按顺序依次执行代码,当前代码任务耗时执行会阻塞后续代码的执行。   同步编程,即是一种典型的请求-响应模型,当请求调用一个函数或方法后,需等待其响应返回,然后执行后续代码。   一般情况下,同步编程,代码按序依次执行,能很好的保证程序的执行,但是在某些场景下,比如读取文件内容,或请求服务器接口数据,需要根据返回的数据内容执行后续操作,读取文件和请求接口直到数据返回这一过程是需要时间的,网络越差,耗费时间越长。   如果按照同步编程方式实现,在等待数据返回这段时间,JavaScript是不能处理其他任务的,此时页面的交互,滚动等任何操作也都会被阻塞,这显然是及其不友好,不可接受的,而这正是需要异步编程大显身手的场景。   我们想通过Ajax请求数据来渲染页面,这是一个在我们前端当中很常见渲染页面的方式。基本每个页面都会都这样的过程。在这里用同步的方式请求页面会怎么样?浏览器锁死,不能进行其他操作。而且每当发送新的请求,浏览器都会锁死,用户体验极差。

原生XMLHttpRequest学习日志

老子叫甜甜 提交于 2019-12-25 11:02:07
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 今天决定学习一下Ajax异步的XMLHttpRequest对象,平时一直使用jQuery.ajax()就万事大吉, 当自己要实现一套时才发现当中的细节事情!jQuery源码真的博大精深优美得很; 先从w3cschool看一下基本的使用方式,参考的jQ版本是v1.11.1 http://www.w3school.com.cn/xml/xml_http.asp 基本流程是先做简单 XMLHttpRequest 兼容处理,提交请求,最后是回调处理结果; setup1 配置 开始时候在想怎样才能写出优美的参数传值,看jQ源码发现是使用jQuery.extend,而且这函数在很多地方都在应用,看来分量很重噢; 手册介绍是用一个或多个其他对象来扩展一个对象,返回被扩展的对象;如果不指定target,则给jQuery命名空间本身进行扩展。 jQ是先定义了基本参数对象ajaxSettings#8830行开始;然后调用ajaxSetup方法,其实这货还是调用了 jQuery.extend去合并对象;只是判断是否是扩展配置对象; 自己太赖了只做最简参数单合并和获取回调方法事情; function ajaxSetup(opations) { if (typeof opations == 'object') { for (key in

线程的同步和异步

北慕城南 提交于 2019-12-17 14:36:32
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 多线程和异步操作的异同 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。甚至有些时候我们就认为多线程和异步操作是等同的概念。但是,多线程和异步操作还是有一些区别的。而这些区别造成了使用多线程和异步操作的时机的区别。 异步操作的本质 所有的程序最终都会由计算机硬件来执行,所以为了更好的理解异步操作的本质,我们有必要了解一下它的硬件基础。 熟悉电脑硬件的朋友肯定对DMA这个词不陌生,硬盘、光驱的技术规格中都有明确DMA的模式指标,其实网卡、声卡、显卡也是有DMA功能的。DMA就是直接内存访问的意思,也就是说,拥有DMA功能的硬件在和内存进行数据交换的时候可以不消耗CPU资源。只要CPU在发起数据传输时发送一个指令,硬件就开始自己和内存交换数据,在传输完成之后硬件会触发一个中断来通知操作完成。这些无须消耗CPU时间的I/O操作正是异步操作的硬件基础。所以即使在DOS这样的单进程(而且无线程概念)系统中也同样可以发起异步的DMA操作。 线程的本质 线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入CPU资源来运行和调度。 异步操作的优缺点 因为异步操作无须额外的线程负担,并且使用回调的方式进行处理,在设计良好的情况下

从python协程理解tornado异步

喜夏-厌秋 提交于 2019-12-15 18:44:01
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 博客原文地址: http://www.v2steve.com/2015/05/31/python/py_tornado_async/ 刚接触tornado时候最疑惑的问题就是tornado.gen.coroutine是怎么实现的。如何在代码中用同步格式实现异步效果。看了几次源码发现其实就是python协程的一个具体应用。下面从生成器开始,说说tornado的异步。 python协程 python利用yield关键字实现生成器,yield就像生化危机里的T病毒,被yield感染的函数都不仅仅是函数,而是一个函数生成器。函数生成器实例化后可以不断调用next方法吐出yield后的值。见下面代码: def gen(): while True: a = yield print a b = gen() b.next() # 直接返回,无输出 b.send(16) # 打印16 如上面代码,函数gen()因为存在 yield 关键字,就变成了一个生成器函数,实例化这个生成器函数gen得到b,调用b的 next() 方法,会执行gen(),直到遇到第一个yield关键字后返回yield后的值(第一次执行直接返回,没有返回值),这时如果继续调用b.next(),就会每次读到yield处返回一个值。但是倘若调用b的send(

使用Spring的@Async创建异步方法

限于喜欢 提交于 2019-12-14 05:20:49
在开发系统的过程中,通常会考虑到系统的性能问题,提升系统性能的一个重要思想就是“串行”改“并行”。说起“并行”自然离不开“异步”,今天我们就来聊聊如何使用Spring的@Async的异步注解。 假设场景 你有一个很耗时的服务,我们在下面的例子中用线程休眠来模拟,服务执行需要5秒钟。假设一个请求需要调用这个服务3次,如果按照“串行”的方法,将至少需要15秒钟。那么为了提升系统的性能,我们采用“并行”的方法,我们最乐观的情况下,只需要5秒就可以了。有人可能会说这个很简单,我们写个多线程的方法就可以了。但是,今天我们看看Spring为我们提供的方法,它使得开发的过程更简单。 创建异步方法 首先,使用IDEA工具创建Spring-Boot项目,并且选择依赖包Lombok,具体步骤略。然后创建BusyService类,并创建busyMethod方法,具体如下: @Service @Slf4j public class BusyService { @Async publicCompletableFuture<String> busyMethod(String name) throws InterruptedException { log.info(name); Strings = "Hello,"+name+"!"; //模拟耗时操作,5秒 Thread.sleep(5000);

libcoro:在c++中支持coroutine

吃可爱长大的小学妹 提交于 2019-12-10 14:52:47
起因 在第一个版本的 libtnet 开发完成之后,我一直在思考如何让异步方式的网络编程更加简单。 虽然 libtnet 通过c++ shared_ptr以及function等技术很大程度上面解决了异步代码编写的一些问题,但是仍然会出现代码逻辑被强制拆分的情况。而这个则是项目中童鞋无法很好的使用其进行开发的原因。 所以我考虑让 libtnet 支持coroutine。 Coroutine 第一次接触coroutine的概念是在lua里面,记得当时想了很久才算弄明白了coroutine的使用以及原理。在lua中,coroutine的使用如下: co = coroutine.create(function () print("begin yield") coroutine.yield() print("after yield") end) coroutine.resume(co) print("after resume") coroutine.resume(co) 我们可以通过resume执行一个新创建或者已经被挂起的coroutine,通过yield挂起当前的coroutine,这样就可以实现类似多线程方式下面的多任务调度。 至于coroutine的原理,很多地方都有说明,主要就在于每个coroutine都有自己的堆栈,这样当coroutine挂起的时候,它的当前执行状态会被完整保留

jquery中post,get,ajax请求相关

蓝咒 提交于 2019-12-06 23:48:57
今天遇到了个问题,用jquery发现结果总是跟预想的不一样。后来查了下才发现,jquery中post,get,ajax等方法是默认是异步进行的!然后就豁然开朗,如果想要修改默认post,get为同步方式,则先使用$.ajaxSetup({ async: false }); 再用post,get就是同步的了。今天记录下来,每天进步一点点。 来源: oschina 链接: https://my.oschina.net/u/586288/blog/66355

Chrome 66 新增异步剪贴板 API

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-06 06:50:41
在过去的几年里我们只能使用 document.execCommand 来操作剪贴板。不过,这种操作剪贴板的操作是同步的,并且只能读取和写入 DOM。 现在 Chrome 66 已经支持了新的 Async Clipboard API ,作为 execCommand 替代品。 这个新的 Async Clipboard API 还可以使用 Promise 来简化剪贴板事件并将它们与 Drag-&-Drop API 一起使用。 演示视频: https://zhuanlan.zhihu.com/p/... 复制:将文本写入剪贴板 writeText() 可以把文本写入剪切板。 writeText() 是异步的,它返回一个 Promise: navigator.clipboard.writeText('要复制的文本') .then(() => { console.log('文本已经成功复制到剪切板'); }) .catch(err => { // This can happen if the user denies clipboard permissions: // 如果用户没有授权,则抛出异常 console.error('无法复制此文本:', err); }); 还可以使用 异步函数 的 async 和 await : async function copyPageUrl() { try

跳出OO的框架以后。。。。。。

我怕爱的太早我们不能终老 提交于 2019-12-05 15:07:40
如果跳出进程(注意进程与线程的区别:线程是调用域的分界处,进程则是地址空间的分界处------因此,线程是调用问题的边界,进程则是“对象”的边界。在线程以外,没有真正的调用;同时,在进程以外,没有真正的“对象”------这源于操作系统的地址保护/隔离机制),也就跳出了OO的框架。这里的技术开始变得五彩纷呈: DCOM,CORBA,IIOP,SOA,REST,WEB SERVICE,ESB,EAI,SCA,MOM,HTTP,SOAP,RIA。。。 进程内的(运行时)技术,集中在性能,可移植性,可靠性,稳定性,健壮性,状态受控性,线程安全等方面。而进程外的(运行时)技术,侧重点在于异构协作,集成,系统架构,资源,异步,传输特性,路由,系统管理,流程,,,等方面。 来源: oschina 链接: https://my.oschina.net/u/109289/blog/29794