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多线程基础——对象及变量并发访问
在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...
随机推荐
- Https的前世今生
1.年前会议 马上要过年了,公司业务上的需求也少了很多,这不,王小二他们召开了一场技术会议,盘点年前能干点啥. 只见C哥写了一份清单,其中一项是全站升级https. C哥说:https是一种趋势,但目 ...
- 常用的web服务器软件整理(win+linux)
(1)Apache Apache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上.Apache源于NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器 ...
- cookie和session的区别及在Django中应用
Django中Cookie和session应用 什么是cookie? cookie是客户端浏览器上的一个文件,以键值对进行保存,类似于字典的 {'key' : 'value'} ,与服务器端没有关系, ...
- 初识TCP协议
一.引言 发送一段TCP数据大致需要经过:用户封装 –> TCP封装 –> IP封装 –>帧封装 Note:用户封装没啥好说的,都是客户自己决定的,在一些简单的应用情况下,这个步骤可 ...
- 输入一段字符串,统计其中的数字,字母,空格,其他字符的方法 ----python---
1.以简单的循环分支实现字符统计 str1 = input("输入字符串:") num=0;word=0;space=0;other=0; for i in str1: if i. ...
- EasyUIDataGrid去掉垂直滚动条
打开jquery.easyui.min.js 搜索到var _64f=wrap.width();这行代码 修改为ar _64f=wrap.width()+20;即可 另外在前台datagrid的hei ...
- superset在 centos 7安装运行
参考:1.http://blog.csdn.net/u014729236/article/details/76302888?locationNum=2&fps=1 2.https://www. ...
- mysql,查询时间戳
1.查询当前时间1天前的时间点 select date_sub(now() ,interval 1 day) 2.查询当前时间的时间1天之后的时间点 select data_sub(now ...
- python+selenium页面自动化 元素定位实际遇到的各种问题(持续更新)
1.class属性有空格 (已验证) 当classname 中存在空格的时候,直接使用find_element_by_class_name时,会显示定位失败,此时,需要将classname中的空格替 ...
- 16. 3Sum Closest (JAVA)
Given an array nums of n integers and an integer target, find three integers in nums such that the s ...