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()
上一篇:深入研究Block用weakSelf、strongSelf、@weakify、@strongify解决循环引用(下)


下一篇:raft 一致性算法