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:\Python\S20\day31\下载和校验\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:\Python\S20\day31\下载和校验\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:\PyCharmProject\s20\day31\下载和校验\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:\PyCharmProject\s20\day31\下载和校验\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:\PyCharmProject\s20\day31\下载和校验\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:\PyCharmProject\s20\day31\下载和校验\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()

 

posted @ 2019-04-12 10:42  learnacode  阅读(147)  评论(0编辑  收藏  举报