• 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路径修改一下
  • 相关阅读:
    如何在windows下安装GIT
    TortoiseGit 安装
    高并发大流量专题---3、前端优化(减少HTTP请求次数)
    高并发大流量专题---2、流量优化(防盗链处理)
    高并发大流量专题---1、高并发大流量解决方案总结
    yii2和laravel比较
    php开发面试题---日常面试题1
    php开发面试题---禁用cookie之后,如何使用session
    剑指offer---4、序列化二叉树
    北风设计模式课程---20、UML类图介绍
  • 原文地址:https://www.cnblogs.com/xujinjin18/p/9333945.html
Copyright © 2020-2023  润新知