zoukankan      html  css  js  c++  java
  • day31并发

    以后你为之奋斗的两点:
        提高cpu的利用率   
        提高用户的体验

     1.纯概念/纯方法

    操作系统的发展历程

    #主要的人机矛盾是什么:CPU的使用率
            #输入输出数据和CPU计算没有关系
    
        #操作系统是怎么进化的
            # 传统的纸袋输入 传输太慢
            # 磁带的存储降低了输入输出数据的时间,提高了CPU的使用率
    
          #(正在用的)关系到以后写程序的效率
            # 多道操作系统的出现 :提高了CPU的利用率,单纯的切换会浪费时间
                #一台计算机可以出现多个任务  玩游戏听歌泡脚的我(之前只是泡脚。。)
                #当一个任务遇到输入输出工作的时候能够让另一个任务使用cpu去计算(多)
            #分时操作系统:降低了cpu的利用率,提高了用户的体验
                #时间片轮转                          #(操作系统运算速度快  看着好像实时的)
            # 实时操作系统:(精密仪器:(开飞机)(分时的话可能不会立刻响应)(立刻响应))
                #精密仪器或者设备
                #实时交易类(股票。。预定飞机票。。)
    
            #(分布式) 给多个计算机处理  个人计算机不用
    
        # 操作系统的作用
            #在具体的应用与所有的硬件之间起到一个协调管理的作用
            #负责分配计算机中所有的资源

    IO和cpu的矛盾

    #输入输出 IO  (Input/Output)
        #向内存当中输入: read,recv,recvfrom,import,input
                        #从硬盘往文件里读
        #从内存输出:    write,send,sendto,print
                        #从内存网硬盘里写
       # cpu 读一个命令 可以做很多事情 读写还是慢 固态读写很快
       # 从硬盘里读一次命令的时间 cpu可以执行450万条指令
       # 每秒执行500百万条指令
       # 5400/s
    # cpu操作和 和IO读写操作的时间(太慢了) 的巨大差距

    # 并发和并行

    # 并发和并行   
      #多个程序交替在同一个cpu(单核)上被计算,并发 #多个程序同时在多个cpu上被计算 并行 # 阻塞 和非阻塞 #阻塞 CPU不工作 #非阻塞 CPU一直在工作 # 异步和同步 # 异步:发布一个任务,不等待这个任务的结果,继续执行我的任务 # 同步:发布一个任务,等待这个任务的结果之后继续执行我的任务 # 同步阻塞 /同步非阻塞/异步阻塞(另个执行了阻塞的第一个)/异步非阻塞(极好的) #程序模型 如何设计

    进程和程序和线程

    # 进程和程序
        #进程 (运行着的程序)
            #每一个进程在计算机中都有唯一的进程 id , pid  proccess id
        #程序(一系列的指令)
    
    # 进程是计算机中资源分配的最小单位 (圈资源) (内存 网络服务端口 文件操作符 执行代码加载到计算机)
        # 三状态  :就绪 阻塞 运行  :减少阻塞 ,提高程序的利用率
    
    # 线程     (执行单位) 是计算机中能够被cpu调度的最小单位
        #进程当中的一个单位  不能独立存在
    
    #进程之间是隔离的               #在一个操作系统里做几个程序
    #线程是没有隔离的都在进程里执行  并发  在一个程序里同时几个事情

      作业:FTP网盘

          文件的上传和下载

      网编的思维导图

      网编的文件上传和下载  要看要会

      ftp的需求分析

      本周日:来写代码

    # 练习题/面试题 归在一类
    # 新的模块
    # 不认识的单词


    讲在课前
      小册子做了吗?被人甩了三条街了
      差距:(与科班的)
       #习惯了老师讲,老师帮
       #自主学习的能力
       # 需求分析 -- 能不能 独立完成 没有意识到     # 自己去设计底层    # 独立解决问题能力的训练    # 写代码的能力

    client

    #__author : 'liuyang' 
    #date : 2019/4/12 0012 上午 9:19
    import socket
    import json
    import os
    import struct
    download_path = r'D:PythonS20day31下载和校验upload'
    
    def pro_send(sk,dic,pro=True):# 协议发送
        bytes_dic = json.dumps(dic).encode('utf-8')
        if pro:
            len_bytes = struct.pack('i', len(bytes_dic))
            sk.send(len_bytes)
        sk.send(bytes_dic)
    
    def pro_recv(sk,pro=True,num = 1024):
        if pro:
            num = sk.recv(4)
            num = struct.unpack('i', num)[0]  # 0 元组
        str_dic = sk.recv(num).decode('utf-8')
        dic = json.loads(str_dic)
        return dic
    
    def login():
        username = input('用户名:')
        password = input('密码:')
        dic = {'user':username,'password':password,'operate':'login'}
        sk = yield
        pro_send(sk, dic)
    
    def upload(sk):
        # 文件的上传  ,考虑是大文件,要先发送文件信息,在发送文件内容
        filepath = input('请输入文件路径:')
        if os.path.isfile(filepath):     #判断是否存在
            filename = os.path.basename(filepath)
            filesize = os.path.getsize(filepath)
            dic = {'filename':filename,'filesize':filesize,'operate':upload}
            pro_send(sk,dic,pro=False)
            with open(filepath,'rb') as f:
                while filesize > 2048:
                    content = f.read(2048)
                    sk.send(content)
                    filesize -= len(content)
                else:
                    content = f.read()
                    sk.send(content)
        print('上传成功')
    def login2():
        username = input('用户名:')
        password = input('密码:')
        dic = {'user': username, 'password': password, 'operate': 'login'}
        sk = socket.socket()
        sk.connect(('127.0.0.1', 9001))
        pro_send(sk, dic)
        dic_ret = pro_recv(sk,pro=False)
        if dic_ret['opt'] == 'login' and dic_ret['flag']:
            print('登陆成功')
        else:
            print('登陆成功')
        return sk
    def download(sk):
        filename = input('文件名:')
                    #filesize只有服务端知道
        #要下载,并且先发送要下载文件的名字
        dic = {'filename': filename, 'operate': 'download'}
        pro_send(sk,dic,False)      #这个好
    
    sk = login2()
    while 1:
        operate = [('上传',upload),('下载',download)]
        for index , opt in enumerate(operate,1):
            print(index,opt[0])
        num = int(input('请输入选择的操作:'))  #多个功能都要这样
        operate[num-1][1](sk)
    client

    server

    #__author : 'liuyang' 
    #date : 2019/4/12 0012 上午 9:19
    import socket
    import json
    import os
    import struct
    import hashlib
    import sys
    upload_path = r'D:PythonS20day31下载和校验upload'
    def get_md5(user,pwd):
        md5 = hashlib.md5(user.encode('utf-8'))
        md5.update(pwd.encode('utf-8'))
        return md5.hexdigest()
    sk = socket.socket()
    sk.bind(('127.0.0.1',9001))
    sk.listen()
    conn, addr = sk.accept()
    
    def pro_recv(conn):
        num = conn.recv(4)
        num = struct.unpack('i', num)[0]  # 0 元组
        str_dic = conn.recv(num).decode('utf-8')
        dic = json.loads(str_dic)
        return dic
    def pro_send(conn,dic,pro=True):# 协议发送
        bytes_dic = json.dumps(dic).encode('utf-8')
        if pro:
            len_bytes = struct.pack('i', len(bytes_dic))
            conn.send(len_bytes)
        conn.send(bytes_dic)
    def login(conn):
    
        dic = pro_recv(conn)
    
        with open('userinfo', encoding='utf-8')as f:
            # 在b 的模式不用encoding
            for line in f:
                username, password = line.strip().split('|')
                if username == dic['user'] and password == get_md5(dic['user'], dic['password']):
                    return {'opt':'login','flag':True}
                else:
                    return {'opt':'login','flag':False}
    
    def upload(dic,conn):
        file_path = os.path.join(upload_path,dic['filename'])
        with open(file_path,'wb')as f:
            while dic['filename']:
                content = conn.recv(2048)
                f.write(content)
                dic['filename']-=len(content)
    
    def download(dic,conn):
        path = os.path.join(upload_path,dic['filename'])
        if os.path.isfile(path):
            #先发字典,再发文件
            filesize = os.path.getsize(path)
            dic = {'filesize':filesize,'exist':True}
            pro_send(conn,dic)
            with open(path,'rb') as f:
                while filesize > 2048:
                    content = f.read(2048)
                    conn.send(content)
                    filesize -= len(content)
                else:
                    content = f.read()
                    conn.send(content)
        else:
            #文件不存在,先发字典,然后结束
            dic = {'exist':False}
            pro_send(conn,dic)
    ret = login(conn)
    bytes_ret = json.dumps(ret).encode('utf-8')
    conn.send(bytes_ret)
    if ret['flag']:
        while True:
            dic = pro_recv(conn)            #operate
            if hasattr(sys.modules[__name__],dic['operate']):
                getattr(sys.modules[__name__], dic['operate'])(dic,conn)
    else:
        print('登录失败')
        conn.close()        #关闭掉  下次在连
    server
    import os
    import json
    import struct
    import socket
    
    download_path = r'D:PyCharmProjects20day31下载和校验download'
    
    def pro_send(sk,dic,pro = True):
        bytes_dic = json.dumps(dic).encode('utf-8')
        if pro:
            len_bytes = struct.pack('i', len(bytes_dic))
            sk.send(len_bytes)
        sk.send(bytes_dic)
    
    def pro_recv(sk,pro = True,num=1024):
        if pro:
            num = sk.recv(4)
            num = struct.unpack('i', num)[0]
        str_dic = sk.recv(num).decode('utf-8')
        dic = json.loads(str_dic)
        return dic
    
    def upload(sk):
        # 文件的上传,考虑是大文件,先发送文件信息,再发送文件内容
        file_path = input('文件路径 :')
        if os.path.isfile(file_path):
            filename = os.path.basename(file_path)
            filesize = os.path.getsize(file_path)
            dic = {'filename':filename,'filesize':filesize,'operate':'upload'}
            pro_send(sk,dic)
            with open(file_path,'rb') as f:
                while filesize > 2048:
                    content = f.read(2048)
                    sk.send(content)
                    filesize -= len(content)
                else:
                    content = f.read()
                    sk.send(content)
            print('上传成功')
        else:
            print('您要上传的文件不存在')
    
    def download(sk):
        filename = input('文件名 :')
        # 要下载,并且先发送要下载文件的名字
        dic = {'filename':filename,'operate':'download'}
        pro_send(sk,dic)
        # server回复:这个文件是否存在,文件的大小
        ret = pro_recv(sk)
        if ret['exist']:
            file_path = os.path.join(download_path,filename)
            # 根据文件大小来接收文件,收到的文件存储在download文件夹下的
            with open(file_path, 'wb') as f:
                while ret['filesize']:
                    content = sk.recv(2048)
                    f.write(content)
                    ret['filesize'] -= len(content)
            print('下载成功')
        else:
            print('您要下载的文件不存在')
    
    # def login():
    #     username = input('用户名 :')
    #     password = input('密 码:')
    #     dic = {'user': username, 'passwd': password, 'operate': 'login'}
    #     sk = yield
    #     pro_send(sk, dic)
    
    def login2():
        username = input('用户名 :')
        password = input('密 码:')
        dic = {'user': username, 'passwd': password, 'operate': 'login'}
        sk = socket.socket()
        sk.connect(('127.0.0.1', 9001))
        pro_send(sk, dic)
        dic_ret = pro_recv(sk,pro = False)
        if dic_ret['opt'] == 'login' and dic_ret['flag']:
            print('登陆成功')
        else:
            print('登陆失败')
            sk.close()
        return sk,dic_ret['flag']
    
    # g = login()
    # next(g)
    # sk = socket.socket()
    # sk.connect(('127.0.0.1',9001))
    # g.send(sk)
    
    sk,flag = login2()
    while flag:
        operate = [('上传',upload),('下载',download)]
        for ind,opt in enumerate(operate,1):
            print(ind,opt[0])
        num = int(input('请输入您要选择的操作 :'))
        operate[num-1][1](sk)
        
    client_teacher
    # 认证 + 上传 + 下载 + 校验
    import os
    import sys
    import json
    import struct
    import socket
    import hashlib
    upload_path = r'D:PyCharmProjects20day31下载和校验upload'
    def get_md5(usr,pwd):
        md5 = hashlib.md5(usr.encode('utf-8'))
        md5.update(pwd.encode('utf-8'))
        return md5.hexdigest()
    
    def pro_recv(conn):
        num = conn.recv(4)
        num = struct.unpack('i', num)[0]
        str_dic = conn.recv(num).decode('utf-8')
        dic = json.loads(str_dic)
        return dic
    
    def pro_send(conn,dic,pro = True):
        bytes_dic = json.dumps(dic).encode('utf-8')
        if pro:
            len_bytes = struct.pack('i', len(bytes_dic))
            conn.send(len_bytes)
        conn.send(bytes_dic)
    
    def login(conn):
        dic = pro_recv(conn)
        with open('userinfo', encoding='utf-8') as f:
            for line in f:
                user, pwd = line.strip().split('|')
                if user == dic['user'] and pwd == get_md5(dic['user'], dic['passwd']):
                    return {'opt':'login','flag':True}
            else:
                return {'opt': 'login', 'flag': False}
    
    def upload(dic,conn):
        file_path = os.path.join(upload_path,dic['filename'])
        with open(file_path,'wb') as f:
            while dic['filesize']:
                content = conn.recv(2048)
                f.write(content)
                dic['filesize'] -= len(content)
    
    def download(dic,conn):
        path = os.path.join(upload_path,dic['filename'])
        if os.path.isfile(path):
            # 文件存在,先发字典,再发文件
            filesize = os.path.getsize(path)
            dic = {'filesize':filesize,'exist':True}
            pro_send(conn,dic)
            with open(path,'rb') as f:
                while filesize > 2048:
                    content = f.read(2048)
                    conn.send(content)
                    filesize -= len(content)
                else:
                    content = f.read()
                    conn.send(content)
        else:
            # 文件不存在,先发字典,然后结束
            dic = {'exist':False}
            pro_send(conn, dic)
    
    sk = socket.socket()
    sk.bind(('127.0.0.1',9001))
    sk.listen()
    
    conn,_ = sk.accept()
    ret = login(conn)
    bytes_ret = json.dumps(ret).encode('utf-8')
    conn.send(bytes_ret)
    if ret['flag']:
        while True:
            dic = pro_recv(conn)
            if hasattr(sys.modules[__name__],dic['operate']):
                getattr(sys.modules[__name__],dic['operate'])(dic,conn)
    else:
        conn.close()
    server_teacher
    import os
    import json
    import struct
    import socket
    
    download_path = r'D:PyCharmProjects20day31下载和校验download'
    
    def pro_send(sk,dic,pro = True):
    
    
    def pro_recv(sk,pro = True,num=1024):
    
    
    def upload(sk):
     
    
    def download(sk):
    
    
    def login2():
     
    
    sk,flag = login2()
    while flag:
        operate = [('上传',upload),('下载',download)]
        for ind,opt in enumerate(operate,1):
            print(ind,opt[0])
        num = int(input('请输入您要选择的操作 :'))
        operate[num-1][1](sk)
    # 认证 + 上传 + 下载 + 校验
    import os
    import sys
    import json
    import struct
    import socket
    import hashlib
    upload_path = r'D:PyCharmProjects20day31下载和校验upload'
    def get_md5(usr,pwd):
    
    def pro_recv(conn):
    
    
    def pro_send(conn,dic,pro = True):
    
    
    def login(conn):
    
    
    def upload(dic,conn):
    
    
    def download(dic,conn):
    
    
    sk = socket.socket()
    sk.bind(('127.0.0.1',9001))
    sk.listen()
    
    conn,_ = sk.accept()
    ret = login(conn)
    bytes_ret = json.dumps(ret).encode('utf-8')
    conn.send(bytes_ret)
    if ret['flag']:
        while True:
            dic = pro_recv(conn)
            if hasattr(sys.modules[__name__],dic['operate']):
                getattr(sys.modules[__name__],dic['operate'])(dic,conn)
    else:
        conn.close()
  • 相关阅读:
    Flink 电商实时数仓(二十三):ClickHouse基础(二)使用基础(2)ClickHouse 的安装(centos)
    Flink 电商实时数仓(二十二):ClickHouse基础(一)使用基础(1)ClickHouse 入门
    Flink 源码(二十六):Flink 内存管理(二)内存数据结构 、管理器
    Flink 源码(二十五):Flink 内存管理(一)内存模型与内存数据结构
    Flink 源码(二十四):Flink 任务调度机制(五)调度
    460. LFU Cache (solution 1)
    785. Is Graph Bipartite? (是否二分图)
    1318. Minimum Flips to Make a OR b Equal to c
    211. Add and Search Word
    188. Best Time to Buy and Sell Stock IV
  • 原文地址:https://www.cnblogs.com/Doner/p/10694577.html
Copyright © 2011-2022 走看看