单线程

nodejs 异步编程 vs promise用法

六月ゝ 毕业季﹏ 提交于 2020-04-07 05:57:42
零、关于异步 如图,是一个传统nodejs项目中比较容易看到的一种编程风格,其原因是因为nodejs底层的很多异步方法都是通过配合回调方法来实现的。理解异步我们必须掌握以下几个知识点: 1、单线程 JavaScript的引擎是单线程的,即无论是在浏览器环境还是基于JavaScript引擎的nodejs服务器环境有且仅有一段代码正被执行,JavaScript引擎不会同时执行a函数的代码和b函数的代码。 2、JavaScript轮询机制(主线程 VS Event Loop线程) 轮询(event loop)简单说,就是在程序中设置两个线程:一个负责程序本身的运行,称为"主线程";另一个负责主线程与其他进程(主要是各种I/O操作)的通信,被称为"Event Loop线程"(可以译为"消息线程")。 就是说执行我们程序员写的代码的是主线程,当主线程遇到io操作的时候, 主线程就 通知 Event Loop线程去执行相应的I/O程序,自己则继续执行其他代码,当Event Loop线程把io任务完成后会主动告诉主线程我已经执行完了,主线程收到通知后会调用事先准备好的回调函数,完成整个任务。 基于以上原因早期的nodejs 代码会存在大量的callback函数嵌套,这些callback正是为主线程在收到Event Loop线程完成io操作后准备的回调函数。 3、如何与Event

[STAThread]的含义

ε祈祈猫儿з 提交于 2020-03-31 06:42:02
Posted on 2007-07-07 10:06 桦林 阅读( 33100) 评论( 10) 编辑 收藏 [STAThread] STAThread:Single Thread Apartment Thread.(单一线程单元线程) []是用来表示Attributes; [STAThread] 是一种线程模型,用在程序的入口方法上(在C#和VB.NET里是Main()方法),来指定当前线程的ApartmentState 是STA。用在其他方法上不产生影响。在aspx页面上可以使用 AspCompat = "true" 来达到同样的效果。这个属性只在 Com Interop 有用,如果全部是 managed code 则无用。简单的说法:[STAThread]指示应用程序的默认线程模型是单线程单元 (STA)。启动线程模型可设置为单线程单元或多线程单元。如果未对其进行设置,则该线程不被初始化。也就是说如果你用的.NET Framework,并且没有使用COM Interop,一般不需要这个Attribute。其它的还有MTA(多线程套间)、Free Thread(自由线程)。 [STAThread] attribute指示应用程序的 COM 线程模型是单线程单元。 而于此对应的多线程单元则是 [MTAThread] (多线程单元线程) COM 线程模型只适用于使用 COM

原生js深入理解系列(七)--- 读JavaScript 执行机制的一点小总结

微笑、不失礼 提交于 2020-03-24 20:30:40
3 月,跳不动了?>>> 总结: js的执行机制是:单线程运行,主线程跑任务,线程队列一个一个宏任务来运行,并且把宏任务内的微任务的全部运行完再继续下一个宏任务。 首先是同步执行其次是异步执行 除了广义的同步任务和异步任务,我们对任务有更精细的定义: macro-task(宏任务):包括整体代码script,setTimeout,setInterval micro-task(微任务):Promise,process.nextTick(promise的回调then()是微任务) 主线程里立即执行的是:new promise, promise 语句, console.log 按出现的先后执行 立即执行的执行完后执行同一个宏任务里的微任务队列,微任务依次执行完毕后再继续下一个宏任务。下面请看掘金作者ssssyoki大佬的娓娓道来,为我们彻底的细致的理解js的执行机制。 这一次,彻底弄懂 JavaScript 执行机制 本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,可以揍我。 不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定的几行代码,我们需要知道其输出内容和顺序。因为javascript是一门单线程语言,所以我们可以得出结论: javascript是按照语句出现的顺序执行的 看到这里读者要打人了

浅析 Node.js 单线程模型

江枫思渺然 提交于 2020-03-21 10:24:47
总结笔记:对于每个用户请求,由主线程接收并存放于一个事件队列中(不做任何处理),当无请求发生时,即主线程空闲,主线程开始循环处理事件队列中的任务: 对于非阻塞JS程序: 1、若某事件需要I/O操作,则主线程发出I/O请求,然后继续执行,由底层的程序实现I/O并返回I/O数据(底层程序是多线程的,JS是单线程的),底层I/O线程处理完后将该事件重新放入事件队列并释放当前线程; 2、某事件不需要I/O操作,则主线程直接处理;(由其他线程处理后放入的事件此时也被主线程直接处理掉); 对于阻塞JS程序: 1、若某事件需要I/O操作,则主线程发出I/O请求,然后等待I/O结束,由底层的程序实现I/O并返回I/O数据,主线程获得该事件所需数据后继续处理该事件; 2、某事件不需要I/O操作,则主线程直接处理; 综上可知,node.js由js解释程序和底层代码实现,JS代码是主线程,是单线程执行,而底层代码是多线程,可同时处理多个I/O请求,js中的阻塞与非阻塞代码只决定js在I/O时继不继续执行(当然,若阻塞执行,底层多线程也没啥用了),而底层会为每一个I/O请求创建一个线程; 注意:这只是对Node.js的一个分析,用来理解nodejs的线程模型而已,实际使用要具体问题具体分析,建议结合http://www.runoob.com/nodejs/nodejs-callback

Redis 单线程模型介绍

末鹿安然 提交于 2020-03-18 16:18:07
1. 理解单线程模型 redis 会将每个客户端都关联一个指令队列。客户端的指令通过队列来按顺序处理,先到先服务。 在一个客户端的指令队列中的指令是顺序执行的,但是多个指令队列中的指令是无法保证顺序的,例如执行完 client-0 的队列中的 command-0 后,接下去是执行哪个队列中的第一个指令是无法确定的,但是肯定不会同时执行两个指令。 redis 同样也会为每个客户端关联一个响应队列,通过响应队列来顺序地将指令的返回结果回复给客户端。 同样,一个响应队列中的消息可以顺序的回复给客户端,多个响应队列之间是无法保证顺序的。 所有的客户端的队列中的指令或者响应,redis 每次都只能处理一个,同一时间绝对不会处理超过一个指令或者响应。 2. 为什么redis使用单线程模型还能保证高性能? (1) 纯内存访问 redis 将所有数据放在内存中,内存的响应时长大约为 100 纳秒,这是 redis 的 QPS 过万的重要基础。 (2) 非阻塞式IO 什么是阻塞式 IO 当我们调用 Scoket 的读写方法,默认它们是阻塞的。 read() 方法要传递进去一个参数 n,表示读取这么多字节后再返回,如果没有读够 n 字节线程就会阻塞,直到新的数据到来或者连接关闭了, read 方法才可以返回,线程才能继续处理。 write() 方法会首先把数据写到系统内核为 Scoket

《【面试突击】— Redis篇》-- Redis的线程模型了解吗?为啥单线程效率还这么高?

房东的猫 提交于 2020-03-15 20:52:16
原文: 《【面试突击】— Redis篇》-- Redis的线程模型了解吗?为啥单线程效率还这么高? 能坚持别人不能坚持的,才能拥有别人未曾拥有的。 关注 编程大道 公众号,让我们一同坚持心中所想,一起成长!! 《【面试突击】— Redis篇》-- Redis的线程模型了解吗?为啥单线程效率还这么高? 在这个系列里,我会整理一些面试题与大家分享,帮助年后和我一样想要在金三银四准备跳槽的同学。 我们一起巩固、突击面试官常问的一些面试题,加油!! 1、面试题 Redis和Memcached有什么区别? Redis的线程模型是什么? 为什么Redis是单线程的但是还可以支撑高并发? 2、面试官心理分析 问这个的时候就是问你Redis的原理了,看你是不是思考过,研究过。Redis最基本的一个内部原理和特点,就是Redis实际上是个单线程工作模型。你要是连这个都不知道,那后面在使用Redis的时候,如果出了问题岂不是什么都不知道,无从下手? 还有可能面试官会问问你Redis和Memcached的区别。不过说实话,近几年,面试官都不太喜欢这么问了。因为memcached是早些年各大互联网公司常用的缓存方案,但是现在近几年基本都是Redis,没什么公司用memcached了。 3、温馨提醒 如果你要是现在还不知道redis和memcached是啥

5.互联网大厂高频面试题-volatile

▼魔方 西西 提交于 2020-03-05 13:34:02
请谈谈你对volatiel的理解? 文章目录 volatile是什么 JMM内存模型之可见性 volatile是什么 首先JUC指的是java的三个包: 首先这个关键字在你日常的单线程工作环境下你是用不到的。 它的3大特性: JMM内存模型之可见性 来源: CSDN 作者: 余生的观澜 链接: https://blog.csdn.net/qq_25310669/article/details/104665678

Redis面试题(一)

ⅰ亾dé卋堺 提交于 2020-03-03 15:18:47
Redis是什么? 答:Redis是一个使用C语言开发的,完全开源免费的,遵守BSD协议的一个高性能key-value数据库。 什么是BSD协议? 答:BSD开源协议是一个给于使用者很大自由的协议。可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。 说说Redis读写速率是多少? 答: Redis读的速度是110000次/s,写的速度是81000次/s 。 Redis有几种数据类型? 答:String(字符串),Hash(散列),List(列表),Set(集合),Zset(有序集合),Bitmap(位图),HyperLogLog(超级日志)和Geospatial(地理空间)。 说说为什么要使用Redis? 答:首先Redis的数据都是存于内存的,所以读写速度快,其次Redis提供了丰富的数据类型,适用于各种场景,最后Redis的特性丰富,可用于缓存,消息,同时还支持事务,操作是原子性的。 Redis是多线程还是单线程? 答:Redis是单进程单线程,所有的网络请求模块都使用一个线程处理,所以Redis也是线程安全的,但是Redis其他模块仍用了多个线程。 Redis为什么是单线程的? 答:因为CPU不是Redis的瓶颈,最有可能成为Redis瓶颈的是机器内存或者网络带宽,而既然CPU不会成为瓶颈,单线程又易实现,自然就采用了单线程的方案。

Python_协程

邮差的信 提交于 2020-03-02 22:26:31
引子   之前我们学习了线程、进程的概念,了解了在操作系统中 进程是资源分配的最小单位,线程是CPU调度的最小单位。 按道理来说我们已经算是把cpu的利用率提高很多了。但是我们知道无论是创建多进程还是创建多线程来解决问题,都要消耗一定的时间来创建进程、创建线程、以及管理他们之间的切换。   随着我们对于效率的追求不断提高, 基于单线程来实现并发 又成为一个新的课题,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发。这样就可以节省创建线进程所消耗的时间。   为此我们需要先回顾下并发的本质:切换+保存状态   cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长       ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态    一:其中第二种情况并不能提升效率,只是为了让cpu能够雨露均沾,实现看起来所有任务都被“同时”执行的效果,如果多个任务都是纯计算的,这种切换反而会降低效率。   为此我们可以基于yield来验证。yield本身就是一种在单线程下可以保存任务运行状态的方法,我们来简单复习一下: #1 yiled可以保存状态,yield的状态保存与操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级

twisted学习(reactor)

心不动则不痛 提交于 2020-02-28 12:46:10
reactor是twisted框架里面一个很重要的抽象,它为我们实现了循环,所以我们不用再去实现循环了。 reactor有如下特点: 1、reactor循环会一致运行下去,可以使用Ctrl+C或者相关的方法停止。但不会占用额外的CPU资源。 2、reactor模式是单线程的,也就是,当我们的callback()运行的时候,reactor循环停止,当twisted函数停止的时候,reactor循环继续。整个过程是一个单线程的。所以,我们必须合理的安排回调函数。 3、一段代码中只能有一个rector循环,reactor再等待事件,然后对事件做出反应,因此也称为事件循环。 #!/usr/bin/python from twisted.internet import reactor def Echo(): print "the reactor is run" print '++++++++++++++++++==' reactor.stop() reactor.callWhenRunning(Echo) print 'hello' reactor.run() 可以看到,Echo()显示在hello之后,也就是说,在reactor.run()之后,再进入到回调函数中。 reactor应该具有监控I/O的本领,查看reactor源码 import sys del sys.modules[