异步io

10.24 总结

流过昼夜 提交于 2019-12-02 06:42:34
1.Event事件的作用: 用来控制线程的执行,由一些线程去控制另一些线程。 from threading import Event,Thread import time #调用Event类实例化一个对象 e=Event() #若该方法出现在任务中,则为False,阻塞 # e.wait() #False #若该方法出现在任务中,则将其他线程中的False改为True,进入就绪态与运行态。 # e.set() #True def light(): print('红灯亮。。') time.sleep(5) #应该开始发送信号,告诉其他线程准备执行。 e.set() print('绿灯亮。。') def car(name): print('正在等红灯。。。') #让所有汽车任务进入阻塞态 e.wait() print(f'{name}正在加速漂移。。') #让一个light线程任务,控制多个car线程任务 t=Thread(target=light) t.start() for line in range(10): t=Thread(target=car,args=(f'童子军jason{line}号', )) t.start() 运行结果: 红灯亮。。 正在等红灯。。。 正在等红灯。。。 . . 绿灯亮。。 童子军jason0号正在加速漂移。。 童子军jason1号正在加速漂移。。

day 31

£可爱£侵袭症+ 提交于 2019-12-02 06:37:57
day 31 Event、进or线程池、协程、IO模型 01.Event 调用该类实例化一个对象 e = Event() 若该方法出现在任务中会进入阻塞态 用一些线程控制其他线程的状态 from threading import Event from threading import Thread import time e = Event() # 创建一个Event对象,初始值为Fales,可通过e.is_set()查看 def func1(): print('func1运行') time.sleep(5) e.set() # 将对象e的值设置为True print('func1结束') def func2(name): print(f'{name}正在等待') e.wait() # 当对象e的值为True时往下执行 print(f'{name}等待结束') t=Thread(target=func1) t.start() for i in range(10): t=Thread(target=func2,args=(i,)) t.start() 02.线程池与进程池 进程池与线程池是用来控制当前程序允许进程/线程的数量 保证在硬件允许的范围内创建(进程/线程)的数量 from concurrent.futures import ProcessPoolExecutor

Day10 - Python协程、异步IO、redis缓存、rabbitMQ队列

丶灬走出姿态 提交于 2019-12-02 06:25:32
引子 到目前为止,我们已经学了网络并发编程的2个套路, 多进程,多线程,这哥俩的优势和劣势都非常的明显,我们一起来回顾下 协程 协程,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程: 协程是一种用户态的轻量级线程 。 协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此: 协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。 协程的好处: 无需线程上下文切换的开销 无需原子操作锁定及同步的开销   "原子操作(atomic operation)是不需要synchronized",所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序是不可以被打乱,或者切割掉只执行部分。视作整体是原子性的核心。 方便切换控制流,简化编程模型 高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。 缺点: 无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上

day31总结

♀尐吖头ヾ 提交于 2019-12-02 06:15:52
目录 回顾 Event事件 线程池与进程池 协程 回顾 1.GIL全局解释器锁 1.本质上是一把互斥锁. 2.Cpython才有的 3.在同一个进程下开启多个线程,让并发变成串行,保证线程安全. 2.何时使用多线程或多进程: - IO密集型: 使用多线程 计算密集型: 使用多进程 3.死锁现象 A,B两把锁,相互调用对方,导致出现死锁现象. 4.递归锁: 解决死锁问题. 普通锁: 只能被一个线程去引用. 递归锁: 可以被多个线程去引用. 当递归锁的引用计数为0才会释放,让其他任务去抢. 5.信号量 互斥锁: 一次只能被一个线程去使用. 信号量(本质上是一把锁): 一次可以被多个线程去使用. 6.线程队列: - FIFO: 先进先出 - LIFO: 后进先出 - 优先级队列: 根据数字的大小进行判断优先级, 数字越小优先级越高. 7.TCP服务端实现并发 - 服务端: - 让连接客户端由串行变成并发 Event事件 Event事件的作用: - 用来控制线程的执行. - 由一些线程去控制另一些线程. from threading import Event from threading import Thread import time # 调用Event类实例化一个对象 e = Event() # 若该方法出现在任务中,则为False,阻塞 # e.wait() # False #

Mysql 三大特性详解

£可爱£侵袭症+ 提交于 2019-12-02 05:11:27
Mysql 三大特性详解 Mysql Innodb后台线程 工作方式 首先Mysql进程模型是单进程多线程的。所以我们通过ps查找mysqld进程是只有一个。 体系架构 InnoDB存储引擎的架构如下图所以,是由多个内存块组成的内存池,同时又多个后台线程进行工作,文件是存储磁盘上的数据。 后台线程 上面看到一共有四种后台线程,每种线程都在不停地做自己的工作,他们的分工如下: Master Thread: 是最核心的线程,主要负责将缓冲池中的数据异步刷新的磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓冲(INSERT BUFFER),UNDO页的回收等。下面几个线程其实是为了分担主线程的压力而在最新的版本中添加的。 IO Thread: InnoDB使用大量的异步IO来处理请求。IO Thread的主要工作就是负责IO请求的回调(call back)处理。异步IO可以分为4个,分别是:write, read, insert buffer 和 log IO thread。 Purge Thread: undo log是用来保证事务的,当一个事务正常提交后,这个undo log可能就不再使用了。purge thread就是用来清除这部分log已经分配的undo页的。 Page Cleaner Thread: 主要是把脏页的刷新从主线程中拿到单独的线程,减轻主线程的压力

JAVA - IO - IO的类型(AIO, BIO, NIO)

狂风中的少年 提交于 2019-12-02 02:05:08
IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 一、BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒绝请求,如果有的话,客户端会线程会等待请求结束后才继续执行。 二、NIO NIO本身是基于事件驱动思想来完成的,其主要想解决的是BIO的大并发问题: 在使用同步I/O的网络应用中,如果要同时处理多个客户端请求,或是在客户端要同时和多个服务器进行通讯,就必须使用多线程来处理。也就是说,将每一个客户端请求分配给一个线程来单独处理。这样做虽然可以达到我们的要求,但同时又会带来另外一个问题。由于每创建一个线程,就要为这个线程分配一定的内存空间(也叫工作存储器),而且操作系统本身也对线程的总数有一定的限制。如果客户端的请求过多,服务端程序可能会因为不堪重负而拒绝客户端的请求,甚至服务器可能会因此而瘫痪。 NIO基于Reactor,当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理,应用再将流读取到缓冲区或写入操作系统。 也就是说,这个时候,已经不是一个连接就要对应一个处理线程了

Reids原理之IO模型

…衆ロ難τιáo~ 提交于 2019-12-01 23:29:39
众所周知Redis是单进程单线程的应用,在如今多核横行的时代,我们不免有疑问,单线程的redis怎么就成了高性能的代表 当有多个线程同时调用redis的时候,那么单线程的redis是怎么处理的呢,这里就不得不说redis内部的IO模型 首先要提到几个概念,阻塞IO,非阻塞IO,同步IO,异步IO,多路复用 首先我们要理解IO的过程才能更好的理解上面这几种情况,IO分为两步,第一阶段是数据准备,第二阶段是数据复制阶段,所谓数据复制阶段就是讲数据从内核复制到用户空间 所谓阻塞IO,即我们传统的阻塞概念,当一个客户端请求发起之后线程会挂起,等待服务端返回请求结果然后继续处理业务逻辑 非阻塞IO,有人认为非阻塞==异步,其实这个是不准确的,非阻塞IO的非阻塞其实只要体现在IO的第一阶段,非阻塞IO会定时check服务端的数据准备情况,这个阶段是非阻塞的,但是一旦数据准备阶段完成了,线程就会阻塞的进行IO的第二阶段,即数据复制,所以非阻塞IO还是属于同步IO 所以只要有线程阻塞的情况都是属于同步IO,线程完全不会阻塞挂起的才是真正的异步IO 多路复用API,多路复用最常用的就是select和epoll,多路复用的最大的特点就是多路,一个select可以同时处理多个套接字的读写请求,这时候IO的阻塞点往往是多路复用的API,而不是IO操作本身

【转】异步、并发、协程原理

拈花ヽ惹草 提交于 2019-12-01 17:05:47
Linux 操作系统在设计上将虚拟空间划分为用户空间和内核空间,两者做了隔离是相互独立的,用户空间给应用程序使用,内核空间给内核使用。 一、异步 应用程序和内核 内核具有最高权限,可以访问受保护的内存空间,可以访问底层的硬件设备。而这些是应用程序所不具备的,但应用程序可以通过调用内核提供的接口来间接访问或操作。所谓的常见的 IO 模型就是基于应用程序和内核之间的交互所提出来的。以一次网络 IO 请求过程中的 read 操作为例,请求数据会先拷贝到系统内核的缓冲区(内核空间),再从操作系统的内核缓冲区拷贝到应用程序的地址空间(用户空间)。而从内核空间将数据拷贝到用户空间过程中,就会经历两个阶段: 等待数据准备 拷贝数据 也正因为有了这两个阶段,才提出了各种网络 I/O 模型。 Unix/Linux的体系架构 同步和异步 同步(Synchronised)和异步(Asynchronized)的概念描述的是应用程序与内核的交互方式,同步是指应用程序发起 I/O 请求后需要等待或者轮询内核 I/O 操作完成后才能继续执行;而异步是指应用程序发起 I/O 请求后仍继续执行,当内核 I/O 操作完成后会通知应用程序,或者调用应用程序注册的回调函数。 阻塞和非阻塞 阻塞和非阻塞的概念描述的是应用程序调用内核 IO 操作的方式,阻塞是指 I/O 操作需要彻底完成后才返回到用户空间;而非阻塞是指 I

java IO NIO BIO 最权威的总结

帅比萌擦擦* 提交于 2019-12-01 13:43:10
1. BIO (Blocking I/O) 1.1 传统 BIO 1.2 伪异步 IO 1.3 代码示例 1.4 总结 2. NIO (New I/O) 2.1 NIO 简介 2.2 NIO的特性/NIO与IO区别 1)Non-blocking IO(非阻塞IO) 2)Buffer(缓冲区) 3)Channel (通道) 4)Selectors(选择器) 2.3 NIO 读数据和写数据方式 2.4 NIO核心组件简单介绍 2.5 代码示例 3. AIO (Asynchronous I/O) 参考 BIO,NIO,AIO 总结 Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。程序员在使用这些 API 的时候,不需要关心操作系统层面的知识,也不需要根据不同操作系统编写不同的代码。只需要使用Java的API就可以了。 在讲 BIO,NIO,AIO 之前先来回顾一下这样几个概念:同步与异步,阻塞与非阻塞。 同步与异步 同步: 同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。 异步: 异步就是发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但是被调用者并没有返回结果,此时我们可以处理其他的请求,被调用者通常依靠事件,回调等机制来通知调用者其返回结果。 同步和异步的区别最大在于异步的话调用者不需要等待处理结果

Java核心技术36讲

随声附和 提交于 2019-12-01 08:14:09
IO 一直是软件开发中的 核心 部分之一,伴随着海量数据增长和分布式系统的发展,IO 扩展能力愈发重要。幸运的是, Java 平台 IO 机制经过不断完善,虽然在某些方面仍有不足,但已经在实践中证明了其构建高扩展性应用的能力。 今天我要问你的问题是, Java 提供 了 哪些 IO 方式 ? NIO 如何 实现 多路复用? 典型回答 Java IO 方式 有很多种,基于不同的 IO 抽象模型和交互方式,可以进行简单区分。 首先,传统的 java.io 包,它基于流模型 实现 , 提供 了我们最熟知的一些 IO 功能,比如 File 抽象、输入输出流等。交互方式是同步、阻塞的方式,也就是说,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞在那里,它们之间的调用是可靠的线性顺序。 java.io 包的好处是代码比较简单、直观,缺点则是 IO 效率和扩展性存在局限性,容易成为应用性能的瓶颈。 很多时候,人们也把 java.net 下面提供的部分网络 API,比如 Socket、ServerSocket、HttpURLConnection 也归类到同步阻塞 IO 类库,因为网络通信同样是 IO 行为。 第二,在 Java 1.4 中引入了 NIO 框架(java.nio 包),提供了 Channel、Selector、Buffer 等新的抽象,可以构建多路复用的