python-study-37
多路复用IO
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
 select IO模型 是让操作系统遍历所有的套接字对象看有没有消息 这种模型效率太低 可能99%的套接字都是无用的(没有消息的) epoll 网络IO模型 套接字对象有消息主动告知 效率高 每个套接字对象都绑定了一个回调函数一样的东西 自己触发 放入索引 应用程序直接用 windows 系统不支持这种网络IO模型 linux支持这种模型 运行网络程序强大 基于这种模型解决网络IO问题 都是多路复用IO模型 web服务一般不需要自己写,但是理论要知道,加深自己的底蕴 select = 一堆套接字(conn(收发消息)) 向操作系统发送系统调用: 以前都是conn 调用recv recvfrom应用程序自己问 现在:多路复用IO是select模块发送系统调用 帮应用程序问 一块问 recv 不收消息 只是问有没有数据到系统里 有的才收 问操作系统这些套接字遍历那些有消息, 操作系统返回有消息的套接字, select返回给应用程序 应用程序在去缓存拷贝数据(cp data 阶段) 对比效率: 阻塞IO:同时只能问一个,一个阻塞,其他全阻塞 非阻塞IO:cpu无效的高占用问题,不断的询问 多路复用:如果select只管理一个conn甚至不如阻塞IO 效率高 因为多了一步 select 但是多路复用可以管理多个conn 一次问一大波,不会因为一个阻塞而全部阻塞,实现了并发的效果 不如非阻塞效率高 多路复用多了一步返回有效的套接字部分,应用程序获得有效信息的套接字在去取值 select timeout 操作系统遍历套接字列表,如果不给结果超过xx秒后 就不管了 直接运行下面代码 无意义不要写 没有结果就没法运行 不需要指定,有消息就返回给应用程序套接字 根据套接字去取消息 不取走就一直在缓存 rlist server conn 两种套接字 recv accept wlist conn 套接字 send xlist 异常 [] 空列表代替 必须传值 帮应用程序询问 accept recv 行为 rl,wl,xl 有消息的套接字 缓存中有消息的 read_list write_list 所有的套接字 server: accept (conn,client_addr) conn: recv 有效的套接字要收走 不然就死循环 多路复用不会造成cpu飙升 不像非阻塞无效占用cpu
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
server: from socket import * import time import select server = socket(AF_INET, SOCK_STREAM) server.bind(('127.0.0.1',8080)) server.listen(5) server.setblocking(False) data_dic={} read_list=[server,] write_list=[] print('start....') while True: rl,wl,xl=select.select(read_list,write_list,[]) #read_list=[server,conn1,conn2,conn3,conn4] # print('read_list:%s rl:%s wl:%s ' %(len(read_list),len(rl),len(wl))) #rl=[conn1,conn2] for sk in rl: if sk == server: conn,addr=sk.accept() read_list.append(conn) else: # sk.recv(1024) # print(sk) data=sk.recv(1024) write_list.append(sk) #一堆套接字对象 但不一定都可以发送 因为缓存问题 不能阻塞在这里 data_dic[sk]=data #存放客户端的消息 一个个处理 for sk in wl: #准备发送的套接字 可以发送的套接字 sk.send(data_dic[sk].upper()) data_dic.pop(sk) write_list.remove(sk) #这里的套接字无意义了 发完消息后 client: from socket import * import os client=socket(AF_INET,SOCK_STREAM) client.connect(('127.0.0.1',8080)) while True: msg='%s say hello' %os.getpid() client.send(msg.encode('utf-8')) data=client.recv(1024) print(data.decode('utf-8'))
异步IO
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
操作系统得支持这种网络IO模型
效率最高的一种IO模型
应用程序给操作系统发完请求就不管了
直接运行其他代码
屏蔽了wait data 和copy data 两个阶段
爬虫在讲具体实现方式
ajax继续讲异步请求
mysql 基本概念和安装
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1、数据库是什么? 数据库本质就是一个C/S的套接字软件 常见的数据库: 关系型: mysql mariadb oracle db2 sqlserver 非关系: 存取数据都是以key:value mongodb redis memcache 2、数据库相关概念 数据库服务器:运行有数据库管理软件的计算机 数据库管理软件mysql:就是一个套接字服务端 库:就是一个文件夹 表:就是一个文件 记录:就相当于文件中的一行内容(抽取事物一系列典型的特征拼到一起,) 数据:用于记录现实世界中的某种状态 www.mysql.org/download 官网 解压即可 路径加入环境变量方便使用 tasklist | findstr mysql 查看mysql服务 mysqld --verbose --help | findstr xx 查看相关命令 my.ini 配置文件自动读 注意文件结构 [mysqld] character-set-server=utf8 collation-server=utf8_general_ci [client] default-character-set=utf8 [mysql] default-character-set=utf8 user="root" password="" server: mysqld.exe 启动服务端 前台运行 taskkill /F /IM mysqld.exe 关闭服务端 mysqld --install 放入后台服务运行 以后就可以在后台开启关闭 services.msc 查看后台服务 mysqld --remove 移除系统服务 mysqld --bind-address="ip" -P="port" 指定ip和端口 net stop mysql 停止服务 net start mysql 开启服务 client: mysql -h127.0.0.1 -P3306 -uroot -p mysql -uroot -p mysql 如果不指定就是默认的odbc 没权限 链接到服务端 ps: 如果密码带有空格要用引号 \s 查看字符编码 select user(); 查看用户 show databases; 查看所有的库 quit 退出
上节课复习
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
上节课复习: 1、协程 什么是? 协程指的是单线程下由应用程序级别实现的并发 即把本来由操作系统控制的切换+保存状态,在应用 程序里实现了 协程的切换vs操作系统的切换 优点: 切换速度远快于操作系统 缺点: 一个任务阻塞了,其余的任务都无法执行 ps:只有遇到io才切换到其他任务的协程才能提升 单线程的执行效率 为何用? 把单个线程的io降到最低,最大限度地提升单个线程的执行效率 如何实现? from gevent import spawn,monkey;monkey.patch_all() 2、io模型 block io nonblocking io 1、对cpu的无效占用率过高 2、不能即时反馈客户端的信息 今日内容: 1、IO多路复用 2、异步IO asyncio aiohttp 3、mysql数据库 1、数据库相关基本概念(*****) 2、安装数据库 3、基本的管理 4、sql语句:增、删、改、查(*****)
注册表问题,一般是由于没有下载干净引起的 报错现象:mysql提示找不到,报错 解决: 1 cmd regedit 2 把mysql路径修改一下