异步io

【IO多路复用】 -- 2019-08-16 22:21:40

南笙酒味 提交于 2019-11-27 13:59:13
原文: http://blog.gqylpy.com/gqy/234 " 目录 一、IO模型介绍 二、阻塞IO(blocking IO) 三、非阻塞IO(non-blocking IO) 四、多路复用IO(IO multiplexing) 五、异步IO(Asynchronous I/O) 六、模型比较分析 七、关于select、poll、epoll 一、IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下: 同步、异步、阻塞、非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network IO。本文最重要的参考文献是Richard Stevens的“UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking ”,6.2节“I/O Models

doraemon的python 网络基础、进程和操作系统发展史

那年仲夏 提交于 2019-11-27 13:49:54
### 8.8 网络基础知识 #### 8.8.1 网络应用开发架构 C/S架构:迅雷 浏览器 飞秋 输入法 百度云 各种游戏 - client 客户端 - server 服务区 B/S构架: 淘宝 邮箱 各种游戏 百度 博客园 知乎 豆瓣 - browser 浏览器 - server 服务器 B/S是特殊的C/S架构 #### 8.8.2 ip 网络:一个实际存在计算机中的硬件 mac地址:每一块网卡上都有一个全球唯一的mac地址 交换机:是连接多台机器并帮助通讯的物力设备,只认识mac地址 协议:两台物理设备之间对于要发送的内容,长度,顺序等的一些约定 ip地址: - ipv4协议 位的点分十进制 32位二进制 - 0.0.0.0——255.255.255.255 - ipv6协议 6位的冒分十六进制 128位二进制表示 - 0:0:0:0:0:0——FFFF:FFFF:FFFF:FFFF:FFFF:FFFF 问题:为什么你外地朋友的电脑我们访问不了 - 答:每一个ip地址想要被所有人访问到,那么这个ip地址就必须申请 内网: ``` # 192.168.0.0 - 192.168.255.255 # 172.16.0.0 - 172.31.255.255 # 10.0.0.0 - 10.255.255.255 ``` 交换机实现的arp协议 -

【IO多路复用】 -- 2019-08-16 19:17:42

断了今生、忘了曾经 提交于 2019-11-27 13:34:11
原文: http://blog.gqylpy.com/gqy/234 " 目录 一、IO模型介绍 二、阻塞IO(blocking IO) 三、非阻塞IO(non-blocking IO) 四、多路复用IO(IO multiplexing) 五、异步IO(Asynchronous I/O) 六、模型比较分析 七、关于select、poll、epoll 一、IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下: 同步、异步、阻塞、非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network IO。本文最重要的参考文献是Richard Stevens的“UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking ”,6.2节“I/O Models

Linux I/O 模型(待修改)

别等时光非礼了梦想. 提交于 2019-11-27 11:38:10
最近看到“服务器并发处理能力”章节,被里面的“I/O模型“搞得有点头晕,所以这里希望通过概念的辨析和对比,能更好的理解Linux的 I/O模型。 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别? 比较常用的IO Model有以下4种: blocking IO、nonblocking IO、IO multiplexing、asynchronous IO 由于signal driven IO在实际中并不常用,所以我这只提及剩下的四种IO Model。 1、blocking IO 用户进程进行I/O操作,一直阻塞到I/O操作完成为止。 示例代码 while ( (n=read(STDIN_FILENO, buf, BUFSIZ) ) > 0) if (write (STDOUT_FILENO, buf, n) != n) err_sys (write error ”) ; 在linux中,默认情况下所有的socket都是blocking,当用户进程调用了recvfrom这个系统调用,kernel就开始了IO的第一个阶段:准备数据。对于network io来说,很多时候数据在一开始还没有到达(比如,还没有收到一个完整的UDP包)

协程与IO模型

眉间皱痕 提交于 2019-11-27 11:10:52
一、协程介绍 协程:是单线程下的并发,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程: 协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的 需要强调: 1. python的线程属于内核级别的,即由操作系统控制调度(如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换其他线程运行)2. 单线程内开启协程,一旦遇到io,自己通过代码控制切换,以此来提升效率;给操作系统感觉这个线程没有没有任何的IO(!!!非io操作的切换与效率无关) 二、协程优缺点及特点 对比操作系统控制线程的切换,用户在单线程内控制协程的切换 优点如下: 1. 协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级 2. 单线程内就可以实现并发的效果,最大限度地利用cpu 缺点如下: 1. 协程的本质是单线程下,无法利用多核,可以是一个程序开启多个进程,每个进程内开启多个线程,每个线程内开启协程 2. 协程指的是单个线程,因而一旦协程出现阻塞,将会阻塞整个线程 总结协程特点: 1.必须在只有一个单线程里实现并发 2.修改共享数据不需加锁 3.用户程序里自己保存多个控制流的上下文栈 4.附加:一个协程遇到IO操作自动切换到其它协程(如何实现检测IO,yield、greenlet都无法实现,就用到了gevent模块(select机制)) 切换

进程池线程池

余生长醉 提交于 2019-11-27 11:01:12
进程池和线程池:      正常来讲开进程和开线程都需要消耗资源,只不过两者比较的情况请下线程消耗的资源比较少,但是线程它还是需要消耗资源的,虽然线程消耗的资源少,但是如果开得线程超级多呢?几亿几十亿那种来访问,计算机超过了你所开线程的极限,那你开线程还有意义么?而且计算机肯定是扛不住的。我们设计程序应该在计算机最大的承受范围之内最大限度的利用计算机,我们应该能做到限制它能开多少进程或者开多少线程,这个时候就用到了进程池和线程池的概念:什么是池呢?在计算机行业是在保证计算机硬件安全的情况下最大限度的利用计算机,池呢它其实是降低了程序的运行效率,但是保证了计算机硬件的安全,这样子就能做到你的这个程序在这台计算机上无限的跑,无限的运行。之所以会有池这个概念,是因为硬件的发展速度跟不上软件的发展速度。 # 线程池: from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import time import os pool = ThreadPoolExecutor(5) # 括号内可以传参数指定线程池内的线程个数,也可以不传,不传默认是当前所在计算机的cpu个数乘5 def task(n): print(n) time.sleep(2) pool.submit(task, 1) # 朝线程池中提交任务

day33_8_15 并发编程4,线程池与协程,io模型

五迷三道 提交于 2019-11-27 10:56:00
一。线程池   线程池是一个处理线程任务的集合,他是可以接受一定量的线程任务,并创建线程,处理该任务,处理结束后不会立刻关闭池子,会继续等待提交的任务,也就是他们的进程/线程号不会改变。   当线程池中的任务没有结束时是不会接受下一个任务的。   它的操作有:   pool = ThreadPoolExecutor()   创建一个线程池,其中括号中代表的是一次可以接纳的线程任务,可以不加参数,不加参数其数量就是当前cpu的个数*5。   res = pool.submit(func,args)   提交一个任务,args代表的是函数的参数。res接受的是该submit的返回值,类似于如下的类: <Future at 0x2057e656940 state=running>   state代表的是当前该线程的状态。   res.result()   而使用result可以将提交的任务函数的返回值获取。   这里的result还有等待任务的返回值的作用。如果任务没结束,就会一直等待,可以将并行操作改成串行操作。   pool.shutdown()   可以将池子关闭,并等待池子终端 任务全部结束再执行下面代码。   例子: import time from concurrent.futures import ThreadPoolExecutor import os from

线程池,进程池,io模型

筅森魡賤 提交于 2019-11-27 10:45:44
一、线程池与进程池   什么是池?简单的说就是一个容器,一个范围    在保证计算机硬件安全的情况下最大限度的充分利用计算机, 池其实是降低了程序的运行效率,但是保证了计算机硬件的安全,也是实现了一个并发的效果,现如今硬件的发展跟不上软件的更新速度 进程池与线程池   开进程开线程都需要消耗资源,只不过两者比较的情况线程消耗的资源比较少   创建进程池: multiprocess.Pool模块 导入的写法:from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor  Pool([numprocess [,initializer [, initargs]]]):创建进程池 1 numprocess:要创建的进程数,如果省略,将默认使用cpu_count()的值 2 initializer:是每个工作进程启动时要执行的可调用对象,默认为None 3 initargs:是要传给initializer的参数组 方法有:p.apply() p.apply_async() p.colse() p.join() 内置函数 pool =ProcessPoolExecutor() # 创建进程池,不写默认为当前计算机cpu的个数 1、进程池的用法: from concurrent.futures import

Day33 并发编程(三) 线程池进程池,协程

泪湿孤枕 提交于 2019-11-27 10:41:29
1.进程池和线程池   开进程和开线程都需要消耗资源,只不过线程相比进程耗费的资源较小,但是计算机的硬件是有限制的,我们不能无限制的去开启进程或者线程.进程池和线程池能帮助我们在计算机承受的范围内最大限度的利用计算机 什么是池   在保证计算机硬件安全的情况下最大限度的利用计算机   池其实是降低了程序的运行效率,但是保证了计算机硬件的安全 怎么使用池   我们首先定义一个池子,在里边放入固定数量的进程或线程,只要有任务来了,就派一个进程或线程去处理任务,如果固定数量的进程或线程使用完了,那么接下来的任务就在外面等待,直到有进程或线程的任务执行完毕,外面的任务才可以拿到空闲的进程或线程执行,这样我们既可以同时使用多个进程或线程,又可以保证计算机硬件不会因为任务过多而导致死机等情况 注意:池子中的进程或线程的数量是固定的,可以自己定义数量,但是里边的进程或线程是不会动态改变的.例如工厂中有5个工人,一堆任务过来,他们只能同时执行5个,一个工人做完一个任务之后再做另一个任务,任务在变,但是工人是不会变的,即虽然任务在变,但是进程或线程只会创建一次,执行多少任务还是那几个,这样也节省了反复开闭进程线程的时间 #1 介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 ProcessPoolExecutor:

linux使用FIO测试磁盘的iops

試著忘記壹切 提交于 2019-11-27 09:59:51
FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括:sync,mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等。 fio 官网地址: http://freshmeat.net/projects/fio/ 一,FIO安装 wget http://brick.kernel.dk/snaps/fio-2.2.5.tar.gz yum install libaio-devel tar -zxvf fio-2.2.5.tar.gz cd fio-2.2.5 make make install 二,FIO用法: 随机读:(可直接用,向磁盘写一个2G文件,10线程,随机读1分钟,给出结果) fio -filename=/tmp/test_randread -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=mytest 说明: filename=/dev/sdb1 测试文件名称,通常选择需要测试的盘的data目录。 direct=1