以后你为之奋斗的两点:
    提高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并发的更多相关文章

  1. day31 python学习 并发编程之多进程理论部分

    一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): 二 进程与程序的区别 程序仅仅只是一堆代码而已,而进程指的是程序的运行 ...

  2. tcp上传大文件举例、udp实现qq聊天、socketserver模块实现并发

    为什么会出现粘包现象(day31提到过,这里再举个例子) """首先只有在TCP协议中才会出现粘包现象,因为TCP协议是流式协议它的特点是将数据量小并且时间间隔比较短的数 ...

  3. day31 协程

    day31 协程 一.死锁与递归锁 ​ 所谓死锁:是指两个或者两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产 ...

  4. .Net多线程编程—并发集合

    并发集合 1 为什么使用并发集合? 原因主要有以下几点: System.Collections和System.Collections.Generic名称空间中所提供的经典列表.集合和数组都不是线程安全 ...

  5. [ 高并发]Java高并发编程系列第二篇--线程同步

    高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...

  6. [高并发]Java高并发编程系列开山篇--线程实现

    Java是最早开始有并发的语言之一,再过去传统多任务的模式下,人们发现很难解决一些更为复杂的问题,这个时候我们就有了并发. 引用 多线程比多任务更加有挑战.多线程是在同一个程序内部并行执行,因此会对相 ...

  7. 关于如何提高Web服务端并发效率的异步编程技术

    最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...

  8. 如何在高并发环境下设计出无锁的数据库操作(Java版本)

    一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...

  9. Java多线程基础——对象及变量并发访问

    在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...

随机推荐

  1. linux7 安装 zlib依赖库 与安装python 3.6

    Linux 安装zlib依赖库 进入src: cd /usr/local/src 下载zlib库: wget http://www.zlib.net/zlib-1.2.11.tar.gz 解压下载的t ...

  2. K8s存储卷、pv和pvc的使用

    emptyDIR 临时目录 hostPath :使用主机的路径 网络存储: 传统的设备存储:NAS,SAN 分布式存储:glusterfs,rbd,cephfs 云存储:EBS,Azure,阿里云的 ...

  3. Maven 打包项目 部署到服务器 重启服务 插件

    1.maven插件wagon-maven-plugin自动部署远程Linux服务器  (http://xxgblog.com/2015/10/23/wagon-maven-plugin/) <p ...

  4. GIS 案例教程-蜂窝多边形制作模型

    GIS 案例教程-蜂窝多边形制作模型 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 优点: 拖放式,非编程,复制即用,不用配置. 效率高,非迭代,可以处理大数据. ...

  5. Tomcat配置https协议访问

    Tomcat9配置https协议访问: https://blog.csdn.net/weixin_42273374/article/details/81010203 配置Tomcat使用https协议 ...

  6. “AS3.0高级动画编程”学习:第一章高级碰撞检测

    AdvancED ActionScript 3.0 Animation 是Keith Peters大师继"Make Things Move"之后的又一力作,网上已经有中文翻译版本了 ...

  7. ajax 常用功能 结构分解

    ajax 和后台交互基本结构 0.触发的事件. 1.获取参数 2.url 3.请求方法get/post 4.对返回结果的处理 .done如果有返加 .fail 失败 $(function () { / ...

  8. python测试开发django-3.url配置

    前言 我们在浏览器访问一个网页是通过url地址去访问的,django管理url配置是在urls.py文件.当一个页面数据很多时候,通过会有翻页的情况,那么页数是不固定的,如:page=1.也就是url ...

  9. Java虚拟机运行时数据区域及垃圾回收算法

    程序计数器 记录正在执行的虚拟机字节码指令的地址(如果正在执行的是本地方法则为空). Java 虚拟机栈 每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表.操作数栈.动态链接.方法出口 ...

  10. iTerm2使用技巧

    iTerm2实用技巧 搜索及文本复制 使用“cmd+f”可以调出搜索框进行文本搜索,然后有个很奇妙的快捷键“tab”键,使用它后会自动高亮当前文本后面的内容.最后按enter键将高亮文本复制到剪切板上 ...