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()
day31并发的更多相关文章
- day31 python学习 并发编程之多进程理论部分
一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): 二 进程与程序的区别 程序仅仅只是一堆代码而已,而进程指的是程序的运行 ...
- tcp上传大文件举例、udp实现qq聊天、socketserver模块实现并发
为什么会出现粘包现象(day31提到过,这里再举个例子) """首先只有在TCP协议中才会出现粘包现象,因为TCP协议是流式协议它的特点是将数据量小并且时间间隔比较短的数 ...
- day31 协程
day31 协程 一.死锁与递归锁 所谓死锁:是指两个或者两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产 ...
- .Net多线程编程—并发集合
并发集合 1 为什么使用并发集合? 原因主要有以下几点: System.Collections和System.Collections.Generic名称空间中所提供的经典列表.集合和数组都不是线程安全 ...
- [ 高并发]Java高并发编程系列第二篇--线程同步
高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...
- [高并发]Java高并发编程系列开山篇--线程实现
Java是最早开始有并发的语言之一,再过去传统多任务的模式下,人们发现很难解决一些更为复杂的问题,这个时候我们就有了并发. 引用 多线程比多任务更加有挑战.多线程是在同一个程序内部并行执行,因此会对相 ...
- 关于如何提高Web服务端并发效率的异步编程技术
最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...
- 如何在高并发环境下设计出无锁的数据库操作(Java版本)
一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...
- Java多线程基础——对象及变量并发访问
在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...
随机推荐
- User authentication in Django(用户认证)
一,概述: auth 系统包括: 1)Users 2)Permissions: Binary (yes/no) flags designating whether a user may perform ...
- Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图(转载)
Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图 2017年04月05日 10:53:13 李学凯 阅读数:104997更多 所属专栏: Intellij Idea ...
- lombok踩坑与思考
虽然接触到lombok已经有很长时间,但是大量使用lombok以减少代码编写还是在新团队编写新代码维护老代码中遇到的. 我个人并不主张使用lombok,其带来的代价足以抵消其便利,但是由于团队编码风格 ...
- CentOS中wget安装
通过linux text最小化安装或者安装Basic Server版本后出现的问题是wget命令不能使用了,这时可以使用rpm命令来安装wget.方法一.网络安装 rpm -ivh http:/ ...
- RabbitMQ的安装与配置
一.安装环境 CentOS6.3 64位操作系统. 二.安装文件 1.安装erlang:Rabbitmq是基于erlang语言开发的,所以先需要安装erlang:我选择的安装包是:erlang-17. ...
- 前端(HTML)初始
一.用socket实现HTML的原理 import socket sk = socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen() while ...
- eclipse在mac上的快捷键
Command + Shift + R: 搜索本地项目文件 Command + Shift + T: 搜索jar中的文件 Command+t:快速显示当前类的结构 command+O: 在某个类文件, ...
- 使用python画一只佩奇
打开界面: 打开python shell界面. 建立脚本: 单击"file"——"new file"来建立脚本. 编写代码: 具体的代码如下. import t ...
- 51-python3 pandas读写excel
转载自:https://blog.csdn.net/brink_compiling/article/details/76890198?locationNum=7&fps=1 0. 前言Pyth ...
- 【转】RabbitMQ基础——和——持久化机制
这里原来有一句话,触犯啦天条,被阉割!!!! 首先不去讨论我的日志组件怎么样.因为有些日志需要走网络,有的又不需要走网路,也是有性能与业务场景的多般变化在其中,就把他抛开,我们只谈消息RabbitMQ ...