单线程

node初步学习

霸气de小男生 提交于 2019-12-05 00:08:26
Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。 Node.js 几乎每一个 API 都是支持回调函数的。 Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。 Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数. 来源: https://my.oschina.net/u/3014477/blog/3131355

rddis处理高并发

谁说胖子不能爱 提交于 2019-12-04 18:26:28
参考: https://www.cnblogs.com/wanlei/p/10464517.html 关于Redis处理高并发 Redis的高并发和快速原因 1.Redis是基于内存的,内存的读写速度非常快; 2.Redis是单线程的,省去了很多上下文切换线程的时间; 3.Redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。 下面重点介绍单线程设计和IO多路复用核心设计快的原因 为什么Redis是单线程的 1.官方答案 因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。 2.性能指标 关于Redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。 3.详细原因 1)不需要各种锁的性能消耗 Redis的数据结构并不全是简单的Key-Value,还有list,hash等复杂的结构,这些结构有可能会进行很细粒度的操作,比如在很长的列表后面添加一个元素,在hash当中添加或者删除 一个对象。这些操作可能就需要加非常多的锁,导致的结果是同步开销大大增加。 总之

python基础(35):协程

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

Redis性能解析--Redis为什么那么快?

久未见 提交于 2019-12-04 12:18:08
Redis性能解析--Redis为什么那么快? https://www.cnblogs.com/xlecho/p/11832118.html echo编辑整理,欢迎转载,转载请声明文章来源。欢迎添加echo微信(微信号:t2421499075)交流学习。 百战不败,依不自称常胜,百败不颓,依能奋力前行。——这才是真正的堪称强大!!! Redis的实际被应用都是因为它的性能,在众多缓存中Redis也是一个比较快的中间件,而且它是单线程操作,没有过的内存开销,给程序带来了更多的扩展空间。 Redis的性能展示 在保证网络通畅的情况下,相同的CPU和相同的Redis版本,处理不同大小的数据,Redis的吞吐量如下图所示,该图来自Redis的官方网站。我们可以在网站中看到。Redis在处理1000字节的数据的时候,都是稳定位置吞吐量在10w,当处理的数据不断增大的时候,吞吐量才慢慢开始下降。 图片来自redis官网 下图是提供的QPS测试图,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。 图片来自redis官网 Redis为什么那么快? 纯内存KV操作 内部是单程实现的(不需要创建/销毁线程,避免上下文切换,无并发资源竞争的问题) 异步非阻塞的I/O(多路复用) 存内存KV操作快在哪里? 我们从上面的介绍里面我们看到了Redis是一个纯kv的操作

JavaScript线程机制与事件机制

房东的猫 提交于 2019-12-04 03:55:58
一、进程与线程 1.进程 进程是指程序的一次执行,它占有一片独有的内存空间,可以通过windows任务管理器查看进程 (如下图)。同一个时间里,同一个计算机系统中允许两个或两个以上的进程处于并行状态,这是多进程。比如电脑同时运行微信,QQ,以及各种浏览器等。 浏览器运行是有些是单进程,如firefox和老版IE,有些是多进程,如chrome和新版IE 。 2.线程 有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)。 线程是指CPU的基本调度单位,是程序执行的一个完整流程,是进程内的一个独立执行单元 。多线程是指在一个进程内, 同时有多个线程运行。 浏览器运行是多线程 。比如用浏览器一边下载,一边听歌,一边看视频。另外我们需要知道 JavaScript语言的一大特点就是单线程 ,为了利用多核CPU的计算能力, HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质 。 由于每个进程至少要干一件事,所以,一个进程至少有一个线程。当然,像Word这种复杂的进程可以有多个线程,多个线程可以同时执行

redis模型(1):单线程模型

流过昼夜 提交于 2019-12-03 12:03:12
1、文件事件处理器 Redis基于Reactor模式开发了自己的网络事件处理器,被称为文件事件处理器,由套接字、I/O多路复用程序、文件事件分派器(dispatcher),事件处理器四部分组成。 I/O多路复用程序会同时监听多个套接字,当被监听的套接字准备好执行accept、read、write、close等操作时,与操作相对应的文件事件就会产生,I/O多路复用程序会将所有 产生事件的套接字 都压入一个队列,然后以有序地每次仅一个套接字的方式传送给文件事件分派器,文件事件分派器接收到套接字后会根据套接字产生的事件类型调用对应的事件处理器。 注意1:只有当上一个套接字产生的事件被所关联的事件处理器执行完毕,I/O多路复用程序才会继续向文件事件分派器传送下一个套接字,所以对每个命令的执行时间是有要求的,如果某个命令执行过长,会造成其他命令的阻塞。所以慎用O(n)命令,Redis是面向快速执行场景的数据库。 注意2:命令的并发性。Redis是单线程处理命令,命令会被逐个被执行,假如有3个客户端命令同时执行,执行顺序是不确定的,但能确定不会有两条命令被同时执行,所以两条incr命令无论怎么执行最终结果都是2。 2、事件 服务器需要处理两类事件: 2.1、文件事件 : Redis服务器对套接字的操作,当一个套接字准备执行连接、读、写、关闭等操作时就会产生一个文件事件。文件事件分为AE

定时任务--单线程

喜你入骨 提交于 2019-12-03 09:18:19
1 public class Demo01 { 2 static long count = 0; 3 public static void main(String[] args) { 4 Runnable runnable = new Runnable() { 5 @Override 6 public void run() { 7 while (true) { 8 try { 9 Thread.sleep(1000); 10 count++; 11 System.out.println(count); 12 } catch (Exception e) { 13 // TODO: handle exception 14 } 15 } 16 } 17 }; 18 Thread thread = new Thread(runnable); 19 thread.start(); 20 } 21 } Thread线程定时任务 1 /** 2 * 使用TimerTask类实现定时任务 3 */ 4 public class Demo02 { 5 static long count = 0; 6 7 public static void main(String[] args) { 8 TimerTask timerTask = new TimerTask() { 9 10 @Override

为什么 Redis 是单线程的?

本小妞迷上赌 提交于 2019-12-03 03:56:12
以前一直有个误区,以为:高性能服务器 一定是 多线程来实现的 原因很简单因为误区二导致的:多线程 一定比 单线程 效率高。其实不然。 在说这个事前希望大家都能对 CPU 、 内存 、 硬盘的速度都有了解了,这样可能理解得更深刻一点,不了解的朋友点:CPU到底比内存跟硬盘快多少 redis 核心就是 如果我的数据全都在内存里,我单线程的去操作 就是效率最高的,为什么呢,因为多线程的本质就是 CPU 模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,就是上下文的切换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。redis 用 单个CPU 绑定一块内存的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成的,所以它是单线程处理这个事。在内存的情况下,这个方案就是最佳方案 —— 阿里 沈询 因为一次CPU上下文的切换大概在 1500ns 左右。 从内存中读取 1MB 的连续数据,耗时大约为 250us,假设1MB的数据由多个线程读取了1000次,那么就有1000次时间上下文的切换, 那么就有1500ns * 1000 = 1500us ,我单线程的读完1MB数据才250us ,你光时间上下文的切换就用了1500us了,我还不算你每次读一点数据 的时间, 那什么时候用多线程的方案呢? 答案是:下层的存储等慢速的情况。比如磁盘 内存是一个 IOPS

Redis单线程理解

匿名 (未验证) 提交于 2019-12-03 00:44:02
简介 从接触Redis到现在,一直被它的单线程问题困扰,这对于一个苛求原理的我来说是种折磨,今天吃饭途中看了几篇博客,茅塞顿开。 个人理解 redis服务端的数据处理(单线程) -->数据返回)。平时所说的redis单线程模型,本质上指的是服务端的数据处理阶段,不牵扯网络连接和数据返回,这是理解redis单线程的第一步。接下来,针对不同阶段分别阐述个人的一些理解。 1:客户端到服务器的网络连接 首先,客户端和服务器是socket通信方式,socket服务端监听可同时接受多个客户端请求,这点很重要,如果不理解可先记住。注意这里可以理解为本质上与redis无关,这里仅仅做网络连接,或者可以理解为,为redis服务端提供网络交互api。 2:redis读写事件发生并向服务端发送请求数据 3:redis服务端的数据处理 3:数据返回 那么什么是Reids的单线程 redis会基于这些建立的连接去探测哪个连接已经接收完了客户端的请求数据(注意:不是探测哪个连接建立好了,而是探测哪个接收完了请求数据),而且这里的探测动作就是单线程的开始,一旦探测到则基于接收到的数据开始数据处理阶段,然后返回数据,再继续探测下一个已经接收完请求数据的网络连接。注意,从探测到数据处理再到数据返回,全程单线程。这应该就是所谓的redis单线程。 至于内部有多复杂我们无需关心,我们追求的是理解流程,苛求原理

事件循环--单线程原理

匿名 (未验证) 提交于 2019-12-03 00:38:01
http://www.haorooms.com/post/js_xiancheng https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/ 主线程:正在执行的代码,会生成函数调用栈。 macro-task(宏任务,新名:task)包括:script(整体代码), setTimeout, setInterval, setImmediate, I/O, UI rendering。 micro-task(微任务,新名:jobs)包括: process.nextTick, Promise, Object.observe(已废弃), MutationObserver(html5新特性,队列中只能有一个) 同步任务,语句只按语句先后顺序执行,前面未执行完,不会执行后面语句。 异步任务,语句不在语句先后顺序上执行,执行到该代码时,加入到相应任务队列,延后执行。 主线程从 script (整体代码)开始第一次循环。之后全局上下文进入函数调用栈。直到调用栈清空(只剩全局),然后执行所有的 jobs。当所有可执行的 jobs 执行完毕之后。循环再次从 task 开始,找到其中一个任务队列执行完毕,然后再执行所有的 jobs,这样一直循环下去。 setTimeout 最小间隔不能低于 4 毫秒,否则会自动增加。 DOM