async

爬虫性能

我怕爱的太早我们不能终老 提交于 2020-03-05 01:47:02
这里我们通过请求网页例子来一步步理解爬虫性能 当我们有一个列表存放了一些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) for

重构:从Promise到Async/Await

China☆狼群 提交于 2020-03-04 12:21:29
摘要: 夸张点说,技术的发展与历史一样,顺之者昌,逆之者亡。JS开发者们,赶紧拥抱Async/Await吧! GitHub仓库: Fundebug/promise-asyncawait 早在半年多之前,我就在鼓吹 Async/Await替代Promise的6个理由 ,似乎还招致了一些 批评 。然而,直到最近,我才真正开始进行代码重构,抛弃Promise,全面使用Async/Await。因为, Node 8终于LTS了 ! Async/Await真的比Promise好吗? 是的是的。 这些天,我大概重构了1000行代码,最大的感觉是代码简洁了很多: 真正地用同步的方式写异步代码 不用写then及其回调函数,减少代码行数,也避免了代码嵌套 所有异步调用可以写在同一个代码块中,无需定义多余的中间变量 async函数会隐式地返回一个Promise,因此可以直接return变量,无需使用Promise.resolve进行转换 下面,我们可以通过一个非常简单的示例来体验一下Async/Await的酸爽: 示例1 const Promise = require("bluebird") var readFile = Promise.promisify(require("fs").readFile) // 使用Promise function usePromise() { let a

@Async如何使用

[亡魂溺海] 提交于 2020-03-04 12:13:09
@Async注解 我们都知道使用@Async标注在方法上,可以使该方法异步的调用执行。而所有异步方法的实际执行是交给TaskExecutor的。 关于@Async的基本知识不做讲解,只是对于使用过程中需要的注意的点做下强调。 最简单的使用 1.启动类添加@EnableAsync注解 package com.lara.springbootconfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableAsync; /** * @author lara */ @SpringBootApplication @EnableAsync public class SpringBootConfigApplication { public static void main(String[] args) { SpringApplication.run(SpringBootConfigApplication.class, args); } } 2. 方法上添加 @Async ,类上添加@Component

ES6 set和map以及async函数

旧巷老猫 提交于 2020-03-03 10:26:38
Map Map 中存储的是 key-value 形式的键值对, 其中的 key 和 value 可以是任何类型的, 即对象也可以作为 key . 这比用对象来模拟的方式就灵活了很多 Map 的创建和初始化 1、可以用new Map()构造函数来创建一个空的 Map // 创建一个空的 Map let m = new Map(); 2、可以在 Map() 构造函数中传入一个数组来创建并初始化一个 Map;传入的数组是二维数组, 其中的每一个子数组都有两个元素, 前者会被作为 key, 后者会被作为 value, 这样就形成了一个 key-value 键值对. 例如: // 用数组来创建一个 非空的 Map let map = [ // 定义一个二维数组, 数组中的每组都有两个元素 ['key1' , 'value1'], // key 是 字符串 "key1", value 是字符串 "value1" [{} , 10000] , // key 是个对象, value 是数值 10000 [ 1, {} ] // key 是个数值类型, value 是对象 ]; let map = new Map(array); // 将数组传入 Map 构造函数中 Map 可用的 方法 set(key, value): 向其中加入一个键值对 get(key): 若不存在 key 则返回

JavaScript异步编程——Async/Await vs Promise

杀马特。学长 韩版系。学妹 提交于 2020-03-02 21:02:19
兼容性 提醒一下各位,Node 现在从版本 7.6 开始就支持 async/await 了。而就在前几天,Node 8已经正式发布了,你可以放心地使用它。 如果你还没有试过它,这里有一堆带有示例的理由来说明为什么你应该马上采用它,并且再也不会回头。 Async/await 对于那些从未听说过这个话题的人来说,如下是一个简单的介绍: Async/await 是一种编写异步代码的新方法。之前异步代码的方案是回调和 promise。 Async/await 实际上是建立在 promise 的基础上。它不能与普通回调或者 node 回调一起用。 Async/await 像 promise 一样,也是非阻塞的。 Async/await 让异步代码看起来、表现起来更像同步代码。这正是其威力所在。 语法 假设函数 getJSON 返回一个 promise ,而该 promise 的完成值是一些JSON对象。我们只想调用它,并输出该JSON,然后返回 "done" 。 如下是用 promise 实现的代码: const makeRequest = () => getJSON() .then(data => { console.log(data) return "done" }) makeRequest() 而这就是用 async/await 看起来的样子: const makeRequest =

nodejs Async详解之二:工具类

旧时模样 提交于 2020-03-02 03:22:22
Async中提供了几个工具类,给我们提供一些小便利: memoize unmemoize log dir noConflict 1. memoize(fn, [hasher]) 有一些方法比较耗时,且对于相同的输入总是有相同的输出。这时可以使用memoize给它加个缓存,对于相同的参数只计算一次,以后就直接从缓存中取结果用了。 比如这里有一个很慢的函数: var slow_fn = function(x, y, callback) { console.log(‘start working for: ‘ + x+’,'+y); t.wait(100); console.log(‘finished: ‘ + x+’,'+y); callback(null, ‘im slow for: ‘+x+’,'+y); }; 可以用memoize生成一个新的带缓存的函数: var fn = async.memoize(slow_fn); 试试同样参数调用两次: fn(‘a’,'b’, function(err, result) { console.log(result); }); // 直接得到之前计算好的值 fn(‘a’,'b’, function(err, result) { console.log(result); }); 注意memoize的参数中还有一个hasher,它是做什么用的呢

iOS多线程编程技术NSThread; NSOperation、GCD三者使用详解

两盒软妹~` 提交于 2020-03-01 14:35:03
三种方式的优缺点介绍: 1)NSThread 优点: NSThread 比其他两个轻量级 缺点: 需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销 2)Cocoa NSOperation 优点: 不需要关心线程管理, 数据同步的事情,可以把精力放在自己需要执行的操作上。 Cocoa operation相关的类是NSOperation, NSOperationQueue. NSOperation是个抽象类,使用它必须用它的子类,可以实现它或者使用它定义好的两个子类: NSInvocationOperation和NSBlockOperation. 创建NSOperation子类的对象,把对象添加到NSOperationQueue队列里执行。 3) GCD (全优点) Grand Central dispatch(GCD)是Apple开发的一个多核编程的解决方案。在iOS4.0开始之后才能使用。GCD是一个替代NSThread, NSOperationQueue,NSInvocationOperation等技术的很高效强大的技术。 下面我用简单易于理解的代码实例来介绍NSThread在开发实践中的使用,具体使用时可以根据实际情况进行扩展: 一、NSThread的使用(基本已过时) [html] view plain copy #import < UIKit

async使用注意事项

怎甘沉沦 提交于 2020-03-01 07:46:37
前言 一次,我封装了一个互斥锁,然后,打算写个程序测试一下。于是写了大概如下代码: #include <memory> #include <stdio.h> #include <future> #include <chrono> #include <semaphore.h> #include <exception> class Mutex { public: Mutex() { if (sem_init(&sem_, 0, 0) != 0) throw std::logic_error("sem_init"); } ~Mutex() { sem_destroy(&sem_); } void lock() { if (sem_post(&sem_) != 0) throw std::logic_error("sem_post"); } void unlock() { if (sem_wait(&sem_) != 0) throw std::logic_error("sem_post"); } private: Mutex(const Mutex&) = delete; Mutex(const Mutex&&) = delete; Mutex& operator=(const Mutex&) = delete; Mutex& operator=(const Mutex&&) =

基于任务的异步编程

我是研究僧i 提交于 2020-02-29 04:41:08
博客迁移 记录《Effective C#》学习过程。 任务运行的几种方法 //1.new方式实例化一个Task,需要通过Start方法启动 Task task = new Task(() => { Console.WriteLine($"task1的线程ID为{Thread.CurrentThread.ManagedThreadId}"); }); task.Start(); //2.Task.Factory.StartNew(Action action)创建和启动一个Task Task task2 = Task.Factory.StartNew(() => { Console.WriteLine($"task2的线程ID为{Thread.CurrentThread.ManagedThreadId}"); }); //3.Task.Run(Action action)将任务放在线程池队列,返回并启动一个Task Task task3 = Task.Run(() => { Console.WriteLine($"task3的线程ID为{ Thread.CurrentThread.ManagedThreadId}"); }); View Code 使用异步方法执行异步工作 对于调用异步方法的主调方法来说,只要异步方法已经返回,这里返回的是Task对象,它就可以继续往下执行。

async和promise都是处理异步请求的,那么选用哪个更好呢

与世无争的帅哥 提交于 2020-02-28 07:04:06
js 异步回调Async/Await与Promise的区别 官网讲解更完善哦 一、Promise import http from '....' ; // promise方法1 function getData1 ( ) { return new Promise ( ( resolve , reject ) => { http . get ( 'getData1' , callback => { console . log ( callback ) ; resolve ( "success" ) } , error => { resolve ( "error" ) ; } ) } ) } function getData2 ( ) { return new Promise ( ( resolve , reject ) => { http . get ( 'getData2' , callback => { console . log ( callback ) ; resolve ( "success" ) } , error => { resolve ( "error" ) ; } ) } ) } // 获取两个异步请求的数据 // Promise-1 let value1 = getData1 ( ) . then ( res => { if ( res === 'success