异步队列

Javascript 异步实现 & 事件循环

不问归期 提交于 2020-01-24 22:37:20
浏览器的进程和线程 一、js的单线程和异步 js的单线程(single threaded)和异步(asynchronous)两个基本矛盾的概念是怎么整合到js上的 首先必须肯定js本身不可能是异步的,但js的宿主环境(比如浏览器,Node)是多线程的 宿主环境通过某种方式(事件驱动)使得js具备了异步的属性 二、浏览器的进程 浏览器的主进程 :负责协调、主控 第三方插件进程 :每种类型的插件对应一个进程,仅当使用该插件时才创建 GPU进程 :最多一个,用于3D绘制等 浏览器渲染进程 (浏览器内核):主要作用为页面渲染,脚本执行,事件处理等 三、浏览器内核线程 1、JS引擎线程 JS引擎一直等待着任务队列中任务的到来,然后加以处理 一个Tab页中无论什么时候都只有一个JS引擎在运行JS程序 2、GUI渲染线程 GUI渲染线程与JS引擎线程是互斥的 当JS引擎执行时GUI线程会被挂起 GUI更新会被保存在一个队列中等到JS引擎空闲时执行 3、定时器线程 传说中的setInterval与setTimeout所在线程 二者的定时计数功能不是由JS引擎完成的,而是通过 单独的线程 来完成的,从而保证计时准确 计时完毕,将回调添加到事件队列中,等待JS引擎空闲执行 4、事件触发线程 点击事件等会在对应条件触发的时候被添加到事件队列,等js引擎空闲执行

Dart 任务调度

爱⌒轻易说出口 提交于 2020-01-23 01:13:39
Dart汇总请点击 这里 如果你不知道如何使用Future 请参考: Dart 异步模型 如果你不了解Dart的事件循环机制 请参考: Dart 事件循环 文章目录 同步代码和异步代码; 这两类代码的不同 1.运行顺序不同 2.运行的机制不同 控制任务调度 将任务添加到MicroTask队列有两种方法 将任务添加到Event队列 使用合理的队列 通过链接的方式指定任务顺序 延时任务 如何处理重量级任务 测试一下你的理解程度 问题1 问题2 总结 同步代码和异步代码; 同步代码:就是一行行写下来的代码 异步代码:就是以Future等修饰的代码 这两类代码的不同 1.运行顺序不同 同步代码和异步代码运行的顺序是不同的: 先运行同步代码,在运行异步代码 复制代码就是,即使我异步代码写在最前面,同步代码写在最后面,我也是先运行后面的同步代码,同步代码都运行完后,在运行前面的异步代码。 一下代码的输出结果是什么? import 'dart:async' ; main ( ) { print ( 'main #1 of 2' ) ; scheduleMicrotask ( ( ) = > print ( 'microtask #1 of 2' ) ) ; new Future . delayed ( new Duration ( seconds : 1 ) , ( ) = > print (

day35 python socket 单线程的并发 io多路复用 协程 greenlet模块 gevent模块

不想你离开。 提交于 2020-01-22 18:25:02
day35 python socket 单线程的并发 io多路复用 协程 greenlet模块 gevent模块 一.socket相关 1.socket: 所有的网络请求都是基于socket实现的,默认是阻塞的 2.requests是用的socket的客户端 3.socket到底哪端(谁)发生了变化 如果客户端向服务端发起连接时, 则服务端发生了变化 如果服务端向客户端发送数据时, 则客户端发生了变化 conn,addr = server.accept() conn.recv() 4.如果想要提高并发(目前有以下两种) 多进程: 计算密集型 多线程: io密集型,如socket请求 二.单线程的并发 需求: 模拟浏览器发送请求: 向百度发送请求搜索三个关键词 1.单线程(串行): 使用requests模块 import requests key_list = ['bajie','wukong','datang'] for item in key_list: ret = requests.get( url="https://www.baidu.com/s?wd=%s" % (item,), headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox

js学习笔记1

会有一股神秘感。 提交于 2020-01-21 07:30:38
html css javascript简介: html 定义了网页的内容 css 描述了网页的布局 javascript 定义了网页了行为 编译器和解释器: 解释器和编译器的工作是解析代码并执行,区别在于,对于静态语言(java,C++,C等)而言,这部分工作由编译器执行,编译器会先将源代码编译为另一种代码(机器码或字节码等)再执行; 而对于javascript这种动态语言,解释器会直接解析源代码并执行 javascript简介: javascript是一种轻量级的编程语言 1.语法简单 2.不用编译:可以由javascript引擎解释执行(但是目前还很难说javascript引擎是解释器还是编译器,因为Chrome的JS引擎V8,为了提高JS的运行性能,在运行之前会先将JS编译为本地的 机器码,然后再去执行机器码,这样效率就会提示很多) 3.不依赖于ide,调试方便(Javascript引擎是浏览器的组成部分之一,一般情况下都是由浏览器开发商自行开发的,如IE9的Chakra、Firefox的TraceMonkey、Chrome的V8,除了Javascript引擎外,浏览器还要做很多其他的事情,例如页面解析、页面渲染、Cookie管理、历史记录等等) Javascript语言特性: 1.单线程:由于Javascript作为浏览器脚本语言,主要的用途是和用户互动,以及操作DOM节点

【网络爬虫学习 --- 设计爬虫架构】

血红的双手。 提交于 2020-01-19 22:20:16
设计爬虫架构 一个设计良好的爬虫架构必须满足如下需求。 (1) 分布式:爬虫应该能够在多台机器上分布执行。 (2) 可伸缩性:爬虫结构应该能够通过增加额外的机器和带宽来提高抓取速度。 (3) 性能和有效性:爬虫系统必须有效地使用各种系统资源,例如,处理器、存储空间和网络带宽。 (4) 质量:鉴于互联网的发展速度,大部分网页都不可能及时出现在用户查询中,所以爬虫应该首先抓取有用的网页。 (5) 新鲜性:在许多应用中,爬虫应该持续运行而不是只遍历一次。 (6) 更新:因为网页会经常更新,例如论坛网站会经常有回帖。爬虫应该取得已经获取的页面的新的拷贝。例如一个搜索引擎爬虫要能够保证全文索引中包含每个索引页面的较新的状态。对于搜索引擎爬虫这样连续的抓取,爬虫访问一个页面的频率应该和这个网页的更新频率一致。 (7) 可扩展性:为了能够支持新的数据格式和新的抓取协议,爬虫架构应该设计成模块化的形式。 爬虫架构 1. 爬虫的简化版本架构如下图所示 这里最主要的关注对象是爬虫和存储库。其中的爬虫部分阶段性地抓取互联网上的内容。存储库存储爬虫下载下来的网页,是分布式的和可扩展的存储系统。在往存储库中加载新的内容时仍然可以读取存储库。 2. 实际的爬虫逻辑架构如下图所示 [ 单线程爬虫结构 ] 。 其中: (1) URLFrontier 包含爬虫当前待抓取的 URL( 对于持续更新抓取的爬虫

解决for循环中异步请求顺序不一致的问题

荒凉一梦 提交于 2020-01-18 21:19:07
for循环,再把循环出来的ID再进行二次请求 这就导致一个问题 请求结果返回顺序不一致 原因:异步请求会把回调事件放入微任务事件队列,宏任务执行完毕再执行微任务,具体参考事件队列机制 解决方法: 通过map方法进行循环请求 将异步请求方法封装起来,返回一个promise 这样将会返回一个具有多个promise的数组 通过promise.all()方法把promise包装成一个新的promise实例 1 // 通过Promise把所有的异步请求放进事件队列中 2 3 getInfo(item ,index) { 4 5 const ms = 1000 * Math.ceil(Math.random() * 3) 6 7 return new Promise((resolve,reject) => { 8 9 setTimeout(() => { 10 11 axios.get(id).then((result) => { 12 13 resolve(result) 14 15 }) 16 17 }, ms) 18 19 }) 20 21 } 22 23 24 25 // 返回多个promise 26 27 let promise = arr.map((item,index) = > { 28 29 arr.forEach((item, index) => { 30 31 return

ajax同步和异步区别

大憨熊 提交于 2020-01-18 08:04:57
同步和异步的区别,ajax的编程步骤解:同步是指一个线程要等待上一个线程执行完才能开始执行,同步可以看做是一个单线程操作,只要客户端请求了,在服务器没有反馈信息之前是一个线程阻塞状态。异步是一个线程在执行中,下一个线程不必等待它执行完就可以开始执行。异步肯定是个多线程。在客户端请求时,可以执行其他线程,并且在把这个线程存放在他的队列里面,有序的执行。异步的效率要高于同步。如果数据在线程间共享,那么必须使用同步! ajax同步异步:默认是true:异步,false:同步。异步传输是面向字符的传输,它的单位是字符;而同步传输是面向比特的传输,它的单位是桢,它传输的时候要求接受方和发送方的时钟是保持一致的。 来源: CSDN 作者: NaiQai 链接: https://blog.csdn.net/qq_37693957/article/details/103908670

分布式之消息队列

旧巷老猫 提交于 2020-01-16 10:58:21
1、为什么要使用消息队列? 主要有三个原因: 解耦、异步、削峰 (1)解耦 传统模式: 传统模式的 缺点 : 系统间耦合性太强,如上图所示,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦! 中间件模式: 中间件模式的的 优点 : 将消息写入消息队列,需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何修改。 (2)异步 传统模式: 传统模式的 缺点 : 一些非必要的业务逻辑以同步的方式运行,太耗费时间。 中间件模式: 中间件模式的的 优点 : 将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度 (3)削峰 传统模式 传统模式的 缺点 : 并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常 中间件模式: 中间件模式的的 优点 : 系统A慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息。在生产中,这个短暂的高峰期积压是允许的。 2、使用了消息队列会有什么缺点? 分析 :一个使用了MQ的项目,如果连这个问题都没有考虑过,就把MQ引进去了,那就给自己的项目带来了风险。我们引入一个技术,要对这个技术的弊端有充分的认识,才能做好预防。 要记住,不要给公司挖坑! 回答 :回答也很容易,从以下两个个角度来答 系统可用性降低 :你想啊,本来其他系统只要运行好好的,那你的系统就是正常的。现在你非要加个消息队列进去

Event Loop原理

纵然是瞬间 提交于 2020-01-16 05:56:51
文章目录 前言 event loop 宏任务&微任务 附录 前言 灵魂三问 JS为什么是单线程的 ? JS最初被设计用在浏览器中,那么想象一下,如果浏览器中的JS是多线程的。 场景描述: 那么现在有2个进程,process1 process2,由于是多进程的JS,所以他们对同一个dom,同时进行操作 process1 删除了该dom,而process2 编辑了该dom,同时下达2个矛盾的命令,浏览器究竟该如何执行呢? 为什么需要异步 ? 如果JS中不存在异步,只能自上而下执行,如果上一行解析时间很长,那么下面的代码就会被阻塞。 对于用户而言,阻塞就意味着"卡死",这样就导致了很差的用户体验 单线程又是如何实现异步的呢 ? 既然JS是单线程的,只能在一条线程上执行,又是如何实现的异步呢? 答案就是**是通过的事件循环(event loop)** event loop javascript 是一门单线程的脚本语言,也就意味着同一个时间只能做一件事,但是单线程有一个问题:一旦这个线程被阻塞就无法继续工作了,这肯定是不行的。由于异步编程可以实现 非阻塞 的调用效果,引入异步编程自然就是顺理成章的事情了。 从同步异步来理解JS的执行机制 console.log(1) setTimeout(function(){ console.log(2) },0) console.log(3)

day40 Pyhton 并发编程03

偶尔善良 提交于 2020-01-15 18:06:54
一.内容回顾   进程是计算机中最小的资源分配单位   进程与进程之间数据隔离,执行过程异步   为什么会出现进程的概念?     为了合理利用cpu,提高用户体验     多个进程是可以同时利用多个cpu的,可以实现并行的效果   僵尸进程   进程 状态码 z/z 僵尸进程 linux   在主进程中控制子进程的方法     子进程对象 = Process (target,args) 在创建的这一刻根本就没有通知操作系统     子进程对象. start() 通知操作系统,开启子进程,异步非阻塞     子进程对象.terminate() 通知操作系统,结束子进程,异步非阻塞     子进程对象.is_alive() 查看子进程是否还活着     子进程对象.join() 阻塞,直到子进程结束     子进程对象.join(timeout = 10) 阻塞最多10s,期间子进程如果结束就结束阻塞, 如果没结束10s之后也结束阻塞 # 守护进程 # 守护进程是一个子进程 # 守护进程会在主进程代码结束之后才结束 # 为什么会这样? # 由于主进程必须要回收所有的子进程的资源 # 所以主进程必须在子进程结束之后才能结束 # 而守护进程就是为了守护主进程存在的 # 不能守护到主进程结束,就只能退而求其次,守护到代码结束了 # 守护到主进程的代码结束,意味着如果有其他子进程没有结束