一、模拟普通同步 我们用两个函数来模拟两个客户端请求,并依次进行处理 def...hljs-string">"__main__": main() 执行结果 开始处理请求req_a 完成处理请求req_a 开始处理请求req_b 完成处理请求req_b 说明:同步是按部就班的依次执行...,始终按照同一个步调执行,上一个步骤未执行完不会执行下一步 二、模拟耗时同步 在处理请求req_a时需要执行一个耗时的工作(如IO)其执行过程如下 ...(): """模拟耗时IO操作"""</span...操作 完成IO操作 ret: io result 完成处理请求req_a 开始处理请求req_b 完成处理请求req_b 说明:耗时的操作会将代码执行阻塞住,即req_a未处理完req_b是无法执行的
有两种办法: 第一种是CPU等着,也就是程序暂停执行后续代码,等100M的数据在10秒后写入磁盘,再接着往下执行,这种模式称为同步IO; 另一种方法是CPU不等待,只是告诉磁盘,“您老慢慢写,不着急,我接着干别的事去了...同步和异步的区别就在于是否等待IO执行的结果。...好比你去麦当劳点餐,你说“来个汉堡”,服务员告诉你,对不起,汉堡要现做,需要等5分钟,于是你站在收银台前面等了5分钟,拿到汉堡再去逛商场,这是同步IO。...很明显,使用异步IO来编写程序性能会远远高于同步IO,但是异步IO的缺点是编程模型复杂。 想想看,你得知道什么时候通知你“汉堡做好了”,而通知你的方法也各不相同。...总之,异步IO的复杂度远远高于同步IO。 读文件 1、读写一个文件之前需要打开它: fileobj = open(filename, mode) mode :文件类型和操作的字符串。
io 操作大致分为两种: 文件 io 网络 io io 操作分为两步 发起 io 请求 接收处理 io 同步 io 和异步 io 最大的区别就是同步 io 的发起方(用户线程)会阻塞或轮询等待 io 完成...同步 io 的特点 1、同步 io 是用户线程发起 io 请求并以阻塞或轮询的方式来等待 io 的完成 2、同步 io 是 io 的发起方,同时也是处理方 3、同步 io 是需要将内核态准备就绪的数据拷贝到用户态...,所以需要阻塞用户态程序并等待 io 完成 异步 io 的特点 1、异步 io 在用户线程发起 io 请求后会立即返回继续执行后续的逻辑流 2、异步 io 是 io 的发起方,但内核态才是处理方 3、异步...io 的处理方是内核态,所以不需要阻塞 阻塞 io: 用户线程发起 io 请求并阻塞用户线程释放 CPU 执行权,等待内核态的 io 处理完成。...总结以上几种 io 模型,除了最后一个是异步 io 模型,其它的 io 模型都是同步。
同步阻塞I/O(Blocking I/O) 同步阻塞I/O,即BIO,这是最常见的I/O模型。在这种模型中,发起I/O操作的线程会被阻塞,直到操作完成。...有上诉我们可知:同步阻塞IO 阻塞发生主要在两个地方。 服务器启动进入就绪状态后,主线程就需要等待客户端的接入,这个过程是阻塞的。...同步非阻塞I/O(Non-blocking I/O) 在同步非阻塞I/O,即NIO,线程发起I/O请求后不会被阻塞,可以继续执行其他任务。
目的 本片文章主要讲解同步I/O与异步I/O相关知识,希望通过编写本篇文章为起点,对windows内核原理知识进行学习与梳理。发现并弥补遗漏的知识点并加以学习。...使用设备内核对象进行线程同步时,无法区分当前完成通知的I/O是读操作还是写操作,因此无论是读还是写都会将其状态设置为触发状态。...此使我们发出的I/O请求时,系统内核返回IO_PENDDING状态,然后线程就可以继续处理其他事情。...总结 同步I/O会阻塞线程,想要提高执行速度必须增加线程,但是会由于线程上下文切换造成性能损失。 Windows下大约每15ms会进行一次线程调度。...使用异步I/O时线程不会阻塞,系统底层将每个I/O请求生成I/O请求包(IRP)加入到设备驱动程序的请求队列中,然后直接返回IO_PENDDING状态表示请求受理成功,当底层设备完成了真实的I/O请求后会通过中断控制器通过中断操作通知
POSIX 同步IO、异步IO、阻塞IO、非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑,所以想写一篇文章整理一下。...POSIX(可移植操作系统接口)把同步IO操作定义为导致进程阻塞直到IO完成的操作,反之则是异步IO 按POSIX的描述似乎把同步和阻塞划等号,异步和非阻塞划等号,但是为什么有的人说同步IO不等于阻塞IO...这一过程就可以看成是使用了阻塞IO模型,因为如果水龙头没有水,他也要等到有水并装满杯子才能离开去做别的事情。很显然,这种IO模型是同步的。 ?...),如果按这样理解,这种IO模型也能称之为非阻塞IO模型,但是按POSIX来看,它也是同步IO,那么也和楼上一样称之为同步非阻塞IO吧。...总结 IO分两阶段: 1.数据准备阶段 2.内核空间复制回用户进程缓冲区阶段 一般来讲:阻塞IO模型、非阻塞IO模型、IO复用模型(select/poll/epoll)、信号驱动IO模型都属于同步IO,
同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?...Stevens在文章中一共比较了五种IO Model: blocking IO nonblocking IO IO multiplexing signal driven...IO asynchronous IO 由于signal driven IO在实际中并不常用,所以我这只提及剩下的四种IO Model。...IO multiplexing IO multiplexing这个词可能有点陌生,但是如果我说select,epoll,大概就都能明白了。有些地方也称这种IO方式为event driven IO。...按照这个定义,之前所述的blocking IO,non-blocking IO,IO multiplexing都属于synchronous IO。
5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO 看了一些文章,发现有很多不同的理解,可能是因为大家入切的角度、环境不一样。所以,我们先说明基本的IO操作及环境。...3-2、同步IO和异步IO 同步IO:导致请求进程阻塞,直到I/O操作完成。 异步IO:不导致请求进程阻塞。 上面两个定义是《UNIX网络编程 卷1:套接字联网API》给出的。...这不是很好理解,我们来扩展一下,先说说同步和异步,同步和异步关注的是双方的消息通信机制: 同步:双方的动作是经过双方协调的,步调一致的。 异步:双方并不需要协调,都可以随意进行各自的操作。...这里我们的双方是指,用户进程和IO设备;明确同步和异步之后,我们在上面网络输入操作例子的基础上,进行扩展定义: 同步IO:用户进程发出IO调用,去获取IO设备数据,双方的数据要经过内核缓冲区同步,完全准备好后...异步IO:用户进程发出IO调用,去获取IO设备数据,并不需要同步,内核直接复制到进程,整个过程不导致请求进程阻塞。
四种组合方式 同步阻塞方式: 发送方发送请求之后一直等待响应。 接收方处理请求时进行的IO操作如果不能马上等到返回结果,就一直等到返回结果后,才响应发送方,期间不能进行其他工作。...同步非阻塞方式: 发送方发送请求之后,一直等待响应。 接受方处理请求时进行的IO操作如果不能马上的得到结果,就立即返回,取做其他事情。...当IO操作完成以后,将完成状态和结果通知接收方,接收方再响应发送方,发送方才进入下一次请求过程。(实际不应用) 异步阻塞方式: 发送方向接收方请求后,不等待响应,可以继续其他工作。...接收方处理请求时进行IO操作如果不能马上得到结果,就一直等到返回结果后,才响应发送方,期间不能进行其他操作。...接收方处理请求时进行IO操作如果不能马上得到结果,也不等待,而是马上返回去做其他事情。 当IO操作完成以后,将完成状态和结果通知接收方,接收方再响应发送方。
因为write调用不会等到硬盘IO完成之后才返回,因此如果OS在write调用之后、硬盘同步之前崩溃,则数据可能丢失。...(synchronized-IO)原语来保证: 1 #include 2 int fsync(int fd); fsync的功能是确保文件fd所有已修改的内容已经正确同步到硬盘上,...类似,但是仅仅在必要的情况下才会同步metadata,因此可以减少一次IO写操作。...使用fdatasync优化日志同步 文章开头时已提到,为了满足事务要求,数据库的日志文件是常常需要同步IO的。由于需要同步等待硬盘IO完成,所以事务的提交操作常常十分耗时,成为性能的瓶颈。...在Berkeley DB下,如果开启了AUTO_COMMIT(所有独立的写操作自动具有事务语义)并使用默认的同步级别(日志完全同步到硬盘才返回),写一条记录的耗时大约为5~10ms级别,基本和一次IO操作
Python IO 文件打开和关闭 文件打开和关闭就是两个函数,一个open函数一个close函数 open函数的原型 open(file, mode='r', buffering=-1, encoding...In [1]: from io import StringIO In [2]: help(StringIO) In [3]: sio = StringIO() # 创建StringIO对象,也可以用...要读取StringIO,可以用一个str初始化StringIO,然后,像读文件一样读取: In [1]: from io import StringIO In [2]: sio = StringIO(...os.path是已字符串的方式操作路径的:import os pathlib是面向对象设计的文件系统路径:import pathlib pathlib在python3.2以上开始默认支持,在python2.7...私有协议pickle pickle 是Python私有的序列化协议 pickle源代码见:lib/python3.5/pickle.py 主要函数 dumps 对象导出为数据,即序列化 loads 数据载入为对象
同步非阻塞模式(NonBlocking IO) 在非阻塞模式中,发出Socket的 accept()和 read()操作时,如果内核中的数据还没有准备好,那么它并不会阻塞用户进程,而是立刻返回一个信息。...= SUCCESS){ } process(buffer); } Java同步非阻塞模式 如上所述,Java的Socket是阻塞模式的典型应用。...* * 此时可以实现非阻塞的IO,但是因为调用了系统底层的阻塞同步IO, * 因此仍然没有从根本上解决问题 * * @Author niujinpeng * @Date 2018/10...整个IO请求的过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据,仍需要不断地轮询、重复请求,消耗了大量的CPU的资源。...一般很少直接使用这种模型,而是在其他IO模型中使用非阻塞IO这一特性。 开发难度相对于阻塞IO模式较难,适合并发小且不需要及时响应的网络应用开发。
中途正好讨论了网络IO的同步、异步、阻塞、非阻塞的概念,当时讲下来,大家的理解各不相同,各执己见。搜索了网络上的一些文章,观点也各不相同,甚至连wiki也将异步和非阻塞当成一个概念在解释。...将数据从内核缓冲区复制到用户进程缓冲区 同步,异步的区别 那么究竟什么是同步和异步的区别呢?...请重点读一下原文6.2节中的信号驱动IO和异步IO中的比较。最后总结出来是: · 同步IO,需要用户进程主动将存放在内核缓冲区中的数据拷贝到用户进程中。...· 异步IO,内核会自动将数据从内核缓冲区拷贝到用户缓冲区,然后再通知用户。 这样,同步和异步的概念就非常明显了。以上的五种IO模型,前面四种都是同步的,只有第五种IO模型才是异步的IO。...结论 · 判断IO是同步还是异步,是看谁主动将数据拷贝到用户进程。 · select或者poll,epoll,是同步调用,进行此调用的用户进程也处于阻塞状态。
中途正好讨论了网络IO的同步、异步、阻塞、非阻塞的概念,当时讲下来,大家的理解各不相同,各执己见。搜索了网络上的一些文章,观点也各不相同,甚至连wiki也将异步和非阻塞当成一个概念在解释。...同步,异步的区别 那么究竟什么是同步和异步的区别呢?...请重点读一下原文6.2节中的信号驱动IO和异步IO中的比较。最后总结出来是: 同步IO,需要用户进程主动将存放在内核缓冲区中的数据拷贝到用户进程中。...异步IO,内核会自动将数据从内核缓冲区拷贝到用户缓冲区,然后再通知用户。 这样,同步和异步的概念就非常明显了。以上的五种IO模型,前面四种都是同步的,只有第五种IO模型才是异步的IO。...结论 判断IO是同步还是异步,是看谁主动将数据拷贝到用户进程。 select或者poll,epoll,是同步调用,进行此调用的用户进程也处于阻塞状态。
Github https://github.com/gongluck/Windows-Core-Program.git //第10章 同步设备IO与异步设备IO.cpp: 定义应用程序的入口点。...// #include "stdafx.h" #include "第10章 同步设备IO与异步设备IO.h" //可提醒IO回调 VOID WINAPI funComplete( _In_...BOOL bres = GetFileSizeEx(hFile, &li);//逻辑大小 li.LowPart = GetCompressedFileSize(TEXT("第10章 同步设备...nullptr; //刷新缓冲区 bres = FlushFileBuffers(hFile); //CancelSynchronousIo //取消线程未完成的同步...(TEXT("第10章 同步设备IO与异步设备IO.cpp"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, nullptr, OPEN_EXISTING
/usr/bin/python print "Python is really a great language,", "isn't it?"...当我输入"Hello Python!"...,它的输出如下: Enter your input: Hello Python Received input is : Hello Python input函数 input([prompt]) 函数和.../usr/bin/python # 打开一个文件 fo = open("/tmp/foo.txt", "wb") fo.write( "Python is a great language....,不过Python也能轻松处理。
from io import StringIO f = StringIO() f.write('hello world!') print(f.getvalue()) hello world!...读取StringIO的内容 from io import StringIO f = StringIO('hello\nHi\ngoodbye!)...二进制的操作使用BytesIO from io import BytesIO f = BytesIO() f.write('中文'.encode('utf-8')) print(f.getvalue(...open('dump.txt', 'rb') d = pickle.load(f) f.close() d {'age':20, 'score':88, 'name':'bart'} Json的操作 -- python
Python 文件I/O 阅读本文需要3分钟 Python提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用file对象做大部分的文件操作。...只讲述所有基本的的I/O函数 1 ✕ open函数 你必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的辅助方法才可以调用它进行读写。...当一个文件对象的引用被重新指定给另一个文件时,Python会关闭之前的文件。用close()方法关闭文件是一个很好的习惯。...需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。...需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。 语法: fileObject.read([count]); 在这里,被传递的参数是要从已打开文件中读取的字节计数。
四种IO模型 Boost application performance using asynchronous I/O把同步阻塞、同步非阻塞、异步阻塞、异步非阻塞的模型讲得很清楚。...有人对于event-driven模型有一些批判,认为多线程模型(同步阻塞模型)不比事件模型差: Thousands of Threads and Blocking I/O,讲了C10K提到的多线程模型的性能瓶颈在如今的内核里已经不存在了...可以稍有下跌但绝不会断崖式下跌 随着负载的增加其延迟线性增长,绝不会出现尖刺 Reactor pattern 事件驱动模型到最后就变成了Reactor Pattern,下面是几篇文章: Scalable IO...The reactor pattern and non-blocking IO对比了Tomcat和vert.x的性能差别,不过看下来发现文章的压测方式存在偏心: 文中给Tomcat的线程少了(只给了500...对于事件驱动模型来说也有CPU用满的问题,现实中总会存在一些阻塞操作会造成CPU闲置,这也就是为什么SEDA和Scalable IO in Java都提到了要额外开线程来处理这些阻塞操作。
领取专属 10元无门槛券
手把手带您无忧上云