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)
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() #关闭掉 下次在连
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)
# 认证 + 上传 + 下载 + 校验 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()
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()