async

async 函数的实现原理

时间秒杀一切 提交于 2020-02-25 23:36:29
基本概念 ES2017 标准引入了 async 函数,使得异步操作变得更加方便。 async 函数是什么?一句话,它就是 Generator 函数的语法糖。 前文有一个 Generator 函数,依次读取两个文件。 const fs = require('fs'); const readFile = function (fileName) { return new Promise(function (resolve, reject) { fs.readFile(fileName, function(error, data) { if (error) return reject(error); resolve(data); }); }); }; const gen = function* () { const f1 = yield readFile('/etc/fstab'); const f2 = yield readFile('/etc/shells'); console.log(f1.toString()); console.log(f2.toString()); }; 上面代码的函数gen可以写成async函数,就是下面这样。 const asyncReadFile = async function () { const f1 = await readFile('/etc

js中的异步神器async/await

孤街醉人 提交于 2020-02-25 18:10:28
使用 async / await, 搭配 promise, 可以通过编写形似同步的代码来处理异步流程, 提高代码的简洁性和可读性。 async async作为一个关键字放到函数前面,async function可以定义一个异步函数。 async function func ( ) {    return 'hi' ; } console . log ( func ( ) ) //Promise {<resolved>: "hi"} async 函数的返回值很特殊: 不管在函数体内 return 了什么值, async 函数的实际返回值总是一个 Promise 对象。对于promise对象,我们应该都知道想要获取promise的返回结果就需要用到then/catch方法来添加回调函数。 func ( ) . then ( ( data ) => { console . log ( data ) //hi } ) 那么如果async函数里面没有返回值呢,它会输出什么 async function func ( ) {   console . log ( 'hi' ) ; } console . log ( func ( ) ) //输出为: //hi //Promise {<resolved>: undefined} 如果async 函数执行完,返回的promise 没有注册回调函数

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)。   两者的主要区别是

爬虫性能相关

橙三吉。 提交于 2020-02-24 13:32:18
爬虫信息相关 这里我们通过请求网页例子来一步步理解爬虫性能 当我们有一个列表存放了一些url需要我们获取相关数据,我们首先想到的是循环 简单的循环串行 这一种方法相对来说是最慢的,因为一个一个循环,耗时是最长的,是所有的时间总和 代码如下: import requests url_list = [ 'http://www.baidu.com', 'http://www.pythonsite.com', 'http://www.cnblogs.com/' ] for url in url_list: result = requests.get(url) print(result.text) 通过线程池 通过线程池的方式访问,这样整体的耗时是所有连接里耗时最久的那个,相对循环来说快了很多 import requests from concurrent.futures import ThreadPoolExecutor def fetch_request(url): result = requests.get(url) print(result.text) url_list = [ 'http://www.baidu.com', 'http://www.bing.com', 'http://www.cnblogs.com/' ] pool = ThreadPoolExecutor(10)

20.案例实战:为@Async实现一个自定义线程池

元气小坏坏 提交于 2020-02-24 04:06:52
代码: https://github.com/NIGHTFIGHTING/spring_boot_learning/tree/master/19-20/agan-boot/agan-boot-async ### 五、为什么要给@Async自定义线程池? @Async注解,在默认情况下用的是SimpleAsyncTaskExecutor线程池,该线程池不是真正意义上的线程池,因为线程不重用,每次调用都会新建一条线程。 可以通过控制台日志输出查看,每次打印的线程名都是[task-1]、[task-2]、[task-3]、[task-4].....递增的。 @Async注解异步框架提供多种线程 SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,每次调用都会创建一个新的线程。 SyncTaskExecutor:这个类没有实现异步调用,只是一个同步操作。只适用于不需要多线程的地方 ConcurrentTaskExecutor:Executor的适配类,不推荐使用。如果ThreadPoolTaskExecutor不满足要求时,才用考虑使用这个类 ThreadPoolTaskScheduler:可以使用cron表达式 ThreadPoolTaskExecutor :最常使用,推荐。 其实质是对java.util.concurrent

koa包教不包会

a 夏天 提交于 2020-02-22 20:50:01
koa 基础教学 课程包教不包会 有任何问题可以联系本人。本人微信公众号"前端攻城狮" 本人邮箱yq979292@163.com 1安装 npm i koa-router -S 路由嵌套 const koa = require ( 'koa' ) ; const app = new koa ( ) ; // Router 实例化路由对象 const Router = require ( 'koa-router' ) ; var router = new Router ( ) router . get ( '/' , async function ( ctx ) { ctx . body = 'koa is ok ' } ) // 实例化子路由; var userRouter = new Router ( ) ; userRouter . get ( '/' , function ( ctx ) { ctx . body = 'user 路由' } ) // 实例化3级路由; var adimin = new Router ( ) adimin . get ( '/' , function ( ctx ) { ctx . body = '三级路由的内容ADMIN' } ) var compony = new Router ( ) compony . get ( '/' ,

await与async的作用及用法

风格不统一 提交于 2020-02-22 19:45:39
await与async的作用及用法 await与async的作用及用法 async和await被称作是异步的终极解决方案 await有两个作用,一是作为求值关键字,二是将异步操作变成同步操作;如果方法中使用了await,那么在方法前面必须加上async 作为求值关键字,await后面可以跟Promise或表达式,可以直接获取Promise中的值或表达式的值 后面跟Promise app . use ( async ( ctx , next ) => { // next()返回的是Promise,a的值是"hello, world!" const a = await next ( ) ; const b = next ( ) ; b . then ( ( res ) => { console . log ( res ) ; // 打印出"hello, world!" } ) } ) ; app . use ( ( ctx , next ) => { return "hello, world!" ; } ) 后面跟表达式 const a = await 100 * 100 ; 将异步操作变成同步操作 await可以阻塞当前线程,将异步操作变成同步,被阻塞的线程并没有被空闲,而是去执行其他的操作 async的作用是将方法的返回值封装成Promise async function t (

TPL操作常见误区

让人想犯罪 __ 提交于 2020-02-22 16:16:01
一、一定要async到底 一定要让async的传染性(调用异步方法要用await,用了await的方法就要声明为async,调用我这个async方法的地方必须要await.....)不要轻易直接调用Task的Wait、WaitAll等方法。等待一个用await,而不是task.Wait();等待多个用await Task.WhenAll(),而不是Task.WaitAll()。 二、用了异步性能不一定高 程序里面使用了异步不一定说性能就一定高,下面的异步方法就没有意义: public async Task<string> GetAsync() { return await Task.Run<string>(() => { using (WebClient client = new WebClient()) { // 这里使用的是同步方法,所以该异步方法没有意义 return client.DownloadString("http://www.baidu.com"); } }); } Task里面还是调用的同步方法,这样就没有意义了。 用了异步之后能用异步API就用异步API,只使用await、WhenAll,不要使用task.Result、Wait()。 ADO.NET、IO、EF等都提供了异步的API。 来源: https://www.cnblogs.com

Dart 中断Future

北慕城南 提交于 2020-02-22 15:49:37
更多 中断future 方法1) import 'package:async/async.dart'; void main() { var get = CancelableOperation.fromFuture( Future.delayed(Duration(seconds: 3)), onCancel: () => print('onCancel'), ); get.value.then(print); Future.delayed(Duration(seconds: 1)).then((_) => get.cancel()); } 方法2) import 'package:async/async.dart'; void main() { var completer = CancelableCompleter(onCancel: () => print('onCancel')); completer.complete(Future.delayed(Duration(seconds: 3))); // 添加future completer.operation.value.then(print);// 订阅future Future.delayed(Duration(seconds: 1)).then((_) => completer.operation.cancel());/

自己封装了一个EF的上下文类.,分享一下,顺便求大神指点

江枫思渺然 提交于 2020-02-22 13:54:12
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.Entity; using System.Data.Entity.Core.Objects; using System.Data.Entity.Infrastructure; using System.Data.Entity.Migrations; using System.Data.Entity.Validation; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Runtime.InteropServices; using System.Text; using EntityFramework.Extensions; using System.Threading.Tasks; //using log4net; //using log4net.Core; namespace _6._0Test { /// <summary> /// 上下文静态实体类 /// </summary> public static class