Pyhton学习——Day36
#异步IO——Asynchronous
#异步效率最高,特点:全程无阻塞
# 在说明synchronous IO和asynchronous IO的区别之前,需要先给出两者的定义。
# Stevens给出的定义(其实是POSIX的定义)是这样子的:
# A synchronous I/O operation causes the requesting process to be blocked until that I/O operationcompletes;
# 一个I/O操作会被阻塞,直到该I/O操作结束
#阻塞IO和非阻塞IO都是同步的状态,只是阻塞的位置不同,阻塞IO阻塞在IO操作部分(内核的数据接收处),
# 非阻塞IO阻塞在拷贝数据(内核的数据拷贝处)#
# An asynchronous I/O operation does not cause the requesting process to be blocked;
# epoll实际上是伪异步
#——————————————各个IO操作比较——————————————————————————#
# 阻塞IO:从开始到结束全程阻塞
# 非阻塞IO:当有数据输入至内核时,内核提取数据处阻塞
# IO多路复用:监听的socket对象有内容时,发现有内容前用select阻塞,发现有内容后在接收信息accept处再阻塞一次
# 异步IO:从开始到信号通知无任何阻塞(接收数据——发出通知——拷贝数据——直接调用)
#—————————————————Server—————————————————————————#
# import selectors
# import socket
# sel = selectors.DefaultSelector()
# def accept(sock, mask):
# conn, addr = sock.accept() # Should be ready
# print('accepted', conn, 'from', addr)
# conn.setblocking(False)
# sel.register(conn, selectors.EVENT_READ, read)
# def read(conn, mask):
# try:
# data = conn.recv(1000) # Should be ready
# if not data:
# raise Exception
# print('echoing', repr(data), 'to', conn)
# conn.send(data) # Hope it won't block
# except Exception as e:
# print('closing', conn)
# sel.unregister(conn)
# conn.close()
# sock = socket.socket()
# sock.bind(('192.168.55.1', 8000))
# sock.listen(100)
# sock.setblocking(False)
# sel.register(sock, selectors.EVENT_READ, accept) #register相当于注册,和accept绑定
# while True: #监听
# print('Server Start')
# events = sel.select()
# print('events',events)
# for key, mask in events:
# callback = key.data
# callback(key.fileobj, mask)
#—————————————————Server—————————————————————————#
#—————————————————Client—————————————————————————#
# import socket
# sk = socket.socket()
# sk.connect(('192.168.55.1',8000))
# while 1:
# inp = input('>>>')
# sk.send(inp.encode('utf-8'))
# data = sk.recv(1024)
# print(data.decode('utf-8'))
#—————————————————Client—————————————————————————#
#—————————————————总结———————————————————————————#
# IO模型,内存空间是整体,不能分割,只能在操作系统层面操作区分内存空间,内核的状态位表示0和1,
# 状态位为0的是内核态,可操作所有的指令集;状态位为1的是用户态,只有部分指令集可以操作
# 进程切换需要消耗大量的资源
# 阻塞:当进程进入阻塞状态时,是不占用CPU的
# 文件描述符:本身就是操作系统的一个记录表,server的sk接收后,会记录变化到记录表中,socket本身就是一个文件描述符
# 缓存I/O:发送数据和接收数据都会经过两个操作系统,发送数据是先发给自己的操作系统内核,通过网卡发送给对方的操作系统内核,
# 对方的操作系统内核再发送给用户
# 阻塞IO:全程阻塞,且一次系统调用
# 非阻塞IO:反复监听,过一段时间监听一次,其余时间CPU可以处理其他功能,如果接收了数据,就要等内核拷贝数据去用户区
# IO多路复用:用select进行监听,接收到数据后,调用accept接收数据,全程阻塞,但是数据已经拷贝指内核区,可以直接调用
# 但是select支持多链接监听,可以监听多个socket文件描述符
# 阻塞IO和非阻塞IO的区别:全程阻塞和非监听部分阻塞
# 同步IO和非同步IO的区别:存在阻塞就是同步IO,不存在阻塞就是异步IO
# select是水平触发
#——————————————————————————————————————————————————#
# 作业:基于selectors模块实现并发的FTP
Pyhton学习——Day36的更多相关文章
- Pyhton学习——Day26
#多态:多态指的是一类事物有多种形态# import abc# class Animal(metaclass = abc.ABCMeta):# 同一类事物:动物# @abc.abstractclass ...
- pyhton 学习
官方学习文档 https://docs.python.org/3/tutorial/
- 20190320_head first pyhton学习笔记之构建发布
1.把代码nester.py放入文件夹nester中,在文件夹中再新建一个setup.py文件,文件内容如下: from distutils.core import setup setup( name ...
- Pyhton学习——Day2
Python开发IDE(工具)Pycharm.eclipse1.循环while 条件 #循环体 #条件为真则执行 #条件为假则执行break用于退出所有循环continue用于退出当前循环 2.Pyc ...
- Pyhton学习——Day28
#上下文协议:文件操作时使用with执行# with open('a.txt','w',encoding='utf-8') as f1:# with语句,为了让一个对象兼容with语句,必须在这个对象 ...
- Pyhton学习——Day27
# hasattr(obj,'name')-->obj.name# getattr(obj,'name',default = 'xxx')--->obj.name# setattr(obj ...
- Pyhton学习——Day25
#面向对象的几个方法#1.静态方法@staticmethod,不能访问类属性,也不能访问实例属性,只是类的工具包#2.类方法:@classmethod,在函数属性前加上类方法,显示为(cls)代表类, ...
- Pyhton学习——Day24
# #面向对象设计:# def dog(name,gender,type):# def jiao(dog):# print('One Dog[%s],wfwfwf'%dog['name'])# def ...
- Pyhton学习——Day23
#re模块方法:findall search#findall:返回所有满足匹配条件的数值,放在列表里#search : #函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象 ...
随机推荐
- 洛谷P1941飞扬的小鸟 完全背包
思维难度不大,就是有许多细节要注意. 1.不能开滚动数组. 2.要特判飞过天花板的情况. Code: #include<cstdio> #include<algorithm> ...
- mysql修改时区的几种方法(转载自https://www.cnblogs.com/shiqiangqiang/p/8393662.html)
说明: 以下记录修改mysql时区的几种方法. 具体: 方法一:通过mysql命令行模式下动态修改 1.1 查看mysql当前时间,当前时区 select curtime(); #或select no ...
- 【UOJ139】【UER #4】被删除的黑白树
题意: 很久很久以前,有一棵树加入了 UOJ 群. 这天,在它讨论“一棵树应该怎么旋转”的时候一不小心被删除了,变成了被删除的树. 突然间,它突然发现它失去了颜色,变成了一棵纯白的树.这让它感觉很焦躁 ...
- 用SufaceGO加微软全家桶做个遥控车(一)
作为一个dotnet技术的新手我是不好意思写帖子的,原因就是本人技术太水了,写出的帖子肯定会让人笑话.所以这次我是厚着脸皮写出这个帖子的,希望大佬们轻喷了.我的目标就是用SurfaceGo实现一个和我 ...
- 工作中常见的Git本地分支与远程分支同步场景
Git 是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. 一直以来本人使用 Git 处理分支都是现用现查,一是因为怕出错,二还是因为懒,作为一名四年开发经验的前端 ...
- OSI层次介绍
1.应用层:为应用软件提供接口,使应用程序能够使用网络服务. 2.表示层:①数据的解码和编码,②数据的加密和解密,③数据的压缩和解压缩. 3.会话层:建立.维护.管理应用程序之间的会话. 功能:对话控 ...
- java实现根据起点终点和日期查询去哪儿网的火车车次和火车站点信息
本文章为原创文章,转载请注明,欢迎评论和改正. 一,分析 之前所用的直接通过HTML中的元素值来爬取一些网页上的数据,但是一些比较敏感的数据,很多正规网站都是通过json数据存储,这些数据通过HTML ...
- (7)JPA - Hibernate【从零开始学Spring Boot】
在说具体如何在spring boot 使用Hibernate前,先抛装引玉些知识点?什么是JPA呢? JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象- ...
- PHP 防xss攻击
PHP直接输出html的,可以采用以下的方法进行过滤: 1.htmlspecialchars函数 2.htmlentities函数 3.HTMLPurifier.auto.php插件 4.Remove ...
- angularjs1-4 事件指令
<div ng-app="myApp"> <div ng-controller="firstController"> <div n ...