python-study-37

多路复用IO



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
View Code
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'))
View Code

 

异步IO

操作系统得支持这种网络IO模型

效率最高的一种IO模型
应用程序给操作系统发完请求就不管了 
直接运行其他代码
屏蔽了wait data 和copy data 两个阶段

爬虫在讲具体实现方式
ajax继续讲异步请求
View Code

 

mysql 基本概念和安装

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  退出
View Code

 

上节课复习

上节课复习:
    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语句:增、删、改、查(*****)
View Code

 

注册表问题,一般是由于没有下载干净引起的

报错现象:mysql提示找不到,报错

解决:
1 cmd   regedit
2 把mysql路径修改一下

 

posted @ 2018-07-19 09:21  xujinjin  阅读(110)  评论(0编辑  收藏  举报