今日内容详细

作业讲解

# 能够实现功能即可 暂时无需整合到一起
上传下载电影:其实写了一个另外一个反过来就可以
# 以上传电影为例
优化:
利用字典来做功能整合
# 思考
1.上传的电影如何判断是否重复
小白思想:校验电影名称是否存在
正确思想:校验电影的md5值(核心是内容不是名称)
2.上传的电影如何判断是否有毒
提前对电影内容加密 之后再次加密比对是否一致

客户端

import socket
import os
import json
import struct client = socket.socket()
client.connect(('127.0.0.1', 8080)) movie_dir_path = r'/Users/jiboyuan/Desktop/直播课/python基础day33/视频'
while True:
# 1.循环展示出需要上传的电影列表
movie_name_list = os.listdir(movie_dir_path)
for i, movie_name in enumerate(movie_name_list, start=1):
print(i, movie_name)
choice = input('请选择您想要上传的电影编号>>>:').strip()
if not choice.isdigit():
continue
choice = int(choice)
if choice not in range(1, len(movie_name_list) + 1):
print('请输入正确的编号')
continue # 2.获取电影名字
target_movie_name = movie_name_list[choice - 1]
# 3.拼接电影路径
movie_path = os.path.join(movie_dir_path, target_movie_name)
# 4.制作字典数据
movie_dict = {
'file_name': target_movie_name,
'file_desc': '请及时补充营养',
'file_size': os.path.getsize(movie_path)
}
movie_dict_json = json.dumps(movie_dict)
movie_dict_len = len(movie_dict_json.encode('utf8'))
# 5.制作字典报头
dict_header = struct.pack('i', movie_dict_len)
# 6.发送字典报头
client.send(dict_header)
# 7.发送字典数据
client.send(movie_dict_json.encode('utf8'))
# 8.发送真实数据
with open(movie_path,'rb') as f:
for line in f:
client.send(line)

服务端

import socket
import json
import struct server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5) sock, addr = server.accept()
# 1.接收固定长度的报头
header = sock.recv(4)
# 2.解析出字典的长度
dict_len = struct.unpack('i', header)[0]
# 3.接收字典数据
dict_bytes = sock.recv(dict_len)
dict_data = json.loads(dict_bytes)
# 4.接收真实数据
recv_size = 0
total_size = dict_data.get('file_size')
file_name = dict_data.get('file_name')
# 5.文件操作
with open(file_name, 'wb') as f:
while recv_size < total_size:
data = sock.recv(1024)
f.write(data)
recv_size += len(data)

UDP协议

UDP叫做用户数据报协议,是OSI七层参考模型中传输层使用的协议,他提供的是不可靠传输,既它在传输过程 中不保证数据的完整性!

UDP使用IP地址和端口号进行标识,以此将数据包发送至目标地址。端口的应用解决了多个UDP数据包发送过程
中使用同一信道的冲突问题。每个UDP数据包分配了一对无符号16位端口号,端口号的范围从0到65536。源端口标识
了源机器上发送数据包的特定进程或程序,而目标端口则标识了目标IP地址上进行该会话的特定应用程序。 # 端口分类:
①知名端口(0~1023):被分配给最重要、最常用的服务。如:DNS的默认端口是53,SSH是22,FTP是21。
②注册端口(1024~49151):操作系统上无任何特别之处,
③其余的端口(49152~65535):可以随意使用的端口。

实现

服务器端

import socket
server = socket.socket(type=socket.SOCK_DGRAM) # 自己指定UDP协议(默认是TCP协议)
server.bind(('127.0.0.1', 8080))
msg, addr = server.recvfrom(1024)
print('msg>>>:', msg.decode('utf8'))
print('addr>>>:', addr)
server.sendto(b'hello baby', addr)

客户端

import socket
client = socket.socket(type=socket.SOCK_DGRAM)
server_addr = ('127.0.0.1', 8080) # 查找通讯录
client.sendto(b'hello server baby', server_addr)
msg, addr = client.recvfrom(1024)
print('msg>>>:', msg.decode('utf8'))
print('addr>>>:', addr)
'''
socket() 创建一个空的套接字
bind() 绑定UDP网络地址
getsockname() 获取套接字绑定的IP地址和端口
recvfrom() 接受返回发送该数据报的客户端地址和字节表示的数据报内容
sendto() 要发送的信息和目标地址
'''

基于UDP实现简易版本的qq

客户端

客户端可以开启多个

import socket

client = socket.socket(type=socket.SOCK_DGRAM)
server_addr = ('127.0.0.1', 8080) while True:
msg = input('请输入想要聊天的内容>>>:').strip()
msg = '来自客户端1的消息:%s' % msg
client.sendto(msg.encode('utf8'), server_addr)
msg, addr = client.recvfrom(1024)
print(msg.decode('utf8'), addr)

服务器端

import socket

server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 8080))
while True:
msg, addr = server.recvfrom(1024)
print(addr)
print(msg.decode('utf8'))
back_msg = input('请回复消息>>>:').strip()
server.sendto(back_msg.encode('utf8'), addr)

操作系统的发展史

学习并发编程其实就是在学习操作系统

操作系统的发展史其实就是提升CPU利用率的过程

第一代计算机(1940~1955)

真空管和穿孔卡片

特点:没有操作系统的概念,所有的程序设计都是直接操控硬件。
优点:每个人独享,可以自己调试代码,找到bug。
缺点:浪费计算机资源。

第二代就算机(1955~1965)

晶体管和批处理系统

特点:把代码都赞到一块,让一个CPU共享,但是还是一个一个的去运行,还是顺序算法(串行)
优点:批处理,节省了机时。
缺点:有人的参与了,搬过来搬过去的麻烦,拖慢程序运行的速度

第三代计算机(1965~1980)

集成电路芯片和多道程序设计

是现代计算机核心部件的雏形、提高CPU的利用率

串行

多个任务排队执行 总耗时就是多个任务完整时间叠加

多道

利用空闲提前准备 缩短总的执行时间并且还能提高CPU利用率(提升CPU利用率 降低程序等待时间)

多道技术

指的是多道(个)程序


'''
强调:目前我们研究并发都是以计算机是单核的情况下:只有一个CPU
'''
1.空间上的复用
多个任务共用一套计算机硬件
2.时间上的复用
切换+保存状态
CPU在两种情况下会被拿走
1.程序遇到IO操作,CPU自动切走运行其他程序
2.程序长时间占用CPU,系统发现之后也会强行切走CPU,保证其他程序也可以使用
'''多个程序要让它们能切换(什么时候要切?一个程序占用的时间过长要切;当CPU遇到IO阻塞时,等待的时间要切)'''

例子

	做饭需要 30min
洗衣需要 50min
烧水需要 20min
串行总共需要耗时:30min + 50min + 20min
多道总共需要耗时:50min

第四代计算机(1980~至今)

个人计算机

进程理论

概念

为了更加精确的描述出一些实际状态

程序: 完成特定任务的一系列指令集合,一堆没有被执行的代码(死的)
代码段+数据段
'''放在磁盘中的程序''' 进程: 正在运行中的程序(活的)
1、用户角度: 进程是程序的一次动态执行过程
2、操作系统: 进程是操作系统分配资源的基本单位,也是最小单位

进程调度算法发展史

1.先来先服务
对短作业任务不太友好
2.短作业优先
多长作业任务不太友好
3.时间片轮转法与多级反馈队列
时间片轮转法:先公平的将CPU分给每个人执行
多级反馈队列:根据作业长短的不同再合理分配CPU执行时间 '''目的就是为了能够让单核的计算机也能够做到运行多个程序'''

进程的三种状态

1、就绪状态。某些进程“万事俱备”(必要资源),只差CPU。(就绪队列)
2、执行状态。某进程占有CPU并在CPU上执行其程序。
3、阻塞状态。某些进程由于某种原因不能继续运行下去,等待处 理问题。也称为等待状态或封锁状态。如:请求I/O。(多个等待队列)

进程状态转换的原因

1)就绪-→执行:
对就绪状态的进程,当进程调度程序按一种选定的策略从中选中一个就绪进程,为之分配了处理机后,该进
程便由就绪状态变为执行状态; 2)执行-→阻塞:
正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态。 如:进程提出输入/输出请求而变成等待外部设备传输信息的状态,进程申请资源(主存空间或外部设备)
得不到满足时变成等待资源状态,进程运行中出现了故障(程序出错或主存储器读写错等)变成等待干预状态等等; 3)阻塞-→就绪:
处于阻塞状态的进程,在其等待的事件已经完成,如输入/输出完成,资源得到满足或错误处理完毕时,处
于等待状态的进程并不马上转入执行状态,而是先转入就绪状态,然后再由系统进程调度程序在适当的时候将
该进程转为执行状态; 4)执行-→就绪:
正在执行的进程,因时间片用完而被暂停执行,或在采用抢先式优先级调度算法的系统中,当有更高优先级
的进程要运行而被迫让出处理机时,该进程便由执行状态转变为就绪状态。

并发与并行

并发:看上去像同时在执行就可以称之为是并发

并行:必须同一时间同时运行才可以称之为并行

 # 并发:
当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)。
"""
饭店里面有多桌客人(任务)
但是只有一个服务员(CPU)
如何让所有客人都感觉被服务员服务着(CPU执行)
让服务员在多桌客人之间快速的来回切换并保存状态即可
让CPU在多个程序之间利用多道技术来回切换+保存状态 单核肯定能够实现并发 但是不能实现并行!!!
""" # 并行:
当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。 """单核计算机肯定不能实现并行!!! 必须要有多个CPU"""

区别

# 并发是指一个处理器同时处理多个任务。

# 并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。 

# 并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生。

高并发与高并行

高并发:我们写的软件可以支持1个亿的并发量,一个亿的用户来了之后都可以感觉到自己被服务着

高并行:我们写的软件可以支持1个亿的并行量,上述话语的言外之意是计算机有一亿个CPU

同步与异步

同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication) 所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。 而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异 步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用 者,或通过回调函数处理这个调用。

典型的异步编程模型比如Node.js

# 同步
提交完任务之后原地等待任务的返回结果 期间不做任何事情
# 异步
提交完任务之后不愿地等待任务的结果 直接去做其他事情 有结果自动提醒

阻塞与非阻塞

# 阻塞:阻塞态
# 非阻塞:就绪态、运行态 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.
阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

同步异步与阻塞非阻塞结合

同步异步:用来描述任务的提交方式
阻塞非阻塞:用来描述任务的执行状态
# 上述两组属于两个不同概念 但是可以结合 同步阻塞:银行排队办理业务 期间不做任何事
同步非阻塞:银行排队办理业务 期间喝水吃东西 但是人还在队列中
异步阻塞:在椅子上坐着 但是不做任何事
异步非阻塞:在椅子上坐着 期间喝水吃东西办公 (程序运行的极致)

python学习-Day34的更多相关文章

  1. Python学习--04条件控制与循环结构

    Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...

  2. Python学习--01入门

    Python学习--01入门 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.和PHP一样,它是后端开发语言. 如果有C语言.PHP语言.JAVA语言等其中一种语言的基础,学习Py ...

  3. Python 学习小结

    python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...

  4. Python学习路径及练手项目合集

    Python学习路径及练手项目合集 https://zhuanlan.zhihu.com/p/23561159

  5. python学习笔记-python程序运行

    小白初学python,写下自己的一些想法.大神请忽略. 安装python编辑器,并配置环境(见http://www.cnblogs.com/lynn-li/p/5885001.html中 python ...

  6. Python学习记录day6

    title: Python学习记录day6 tags: python author: Chinge Yang date: 2016-12-03 --- Python学习记录day6 @(学习)[pyt ...

  7. Python学习记录day5

    title: Python学习记录day5 tags: python author: Chinge Yang date: 2016-11-26 --- 1.多层装饰器 多层装饰器的原理是,装饰器装饰函 ...

  8. [Python] 学习资料汇总

    Python是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大且完善的通用型语言,已经有十多年的发展历史,成熟且稳定.Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用 ...

  9. Python学习之路【目录】

    本系列博文包含 Python基础.前端开发.Web框架.缓存以及队列等,希望可以给正在学习编程的童鞋提供一点帮助!!! 目录: Python学习[第一篇]python简介 Python学习[第二篇]p ...

随机推荐

  1. 转-MySQL 数据库误删除后的数据恢复操作说明

    在日常运维工作中,对于mysql数据库的备份是至关重要的!数据库对于网站的重要性使得我们对mysql数据的管理不容有失!然后,是人总难免会犯错误,说不定哪天大脑短路了来个误操作把数据库给删除了,怎么办 ...

  2. 判断一文件是不是字符设备文件,如果是将其拷贝到 /dev 目录下?

    #!/bin/bashread -p "Input file name: " FILENAMEif [ -c "$FILENAME" ];then cp $FI ...

  3. linux下的shell脚本

    先说明以下内容来自: http://c.biancheng.net/cpp/shell/ ,C语言中文网,请大家支持原作,点击链接查看. 我写下来只是作为笔记,如果侵权,请留言,立马删除. Shell ...

  4. 什么是 Idempotence 以及它在哪里使用?

    幂等性是能够以这样的方式做两次事情的特性,即最终结果将保持不变,即好像 它只做了一次. 用法:在远程服务或数据源中使用 Idempotence,这样当它多次接收指令时,它 只处理指令一次.

  5. 学习zabbix(十)

    Zabbix 3.0 基础介绍 [一] 一.Zabbix介绍   zabbix 简介 Zabbix 是一个高度集成的网络监控解决方案,可以提供企业级的开源分布式监控解决方案,由一个国外的团队持续维护更 ...

  6. Solution Architect

    Solution Architect How to become a solution architect - CareerExplorer What does a solution architec ...

  7. 【静态页面架构】CSS之链接和图像

    CSS架构 一.链接: 链接元素:通过使用a元素的href属性设置跳转到指定页面地址 <style> a{ color: blue; text-decoration: none; } a: ...

  8. html简单响应式滚动条置顶

    简单响应式滚动条置顶 一般的,让页面出现滚动条的常见方法有: overflow:auto||overflow:scroll 或者overflow-x水平滚动条和overflow-y垂直滚动条 那么现在 ...

  9. 学习HTML5 history API

    html5 在 history 对象上添加几个新的方法.事件.属性,用以增强开发者对于浏览器历史记录的控制.大体上说,新的API可以帮助我们在无刷新的情况下改变浏览器的url,新增或者替换之前的历史记 ...

  10. html实体编码遇上js代码

    单双引号 在js代码中 在js中单.双引号引起来的是字符串,如果我们要在字符串中使用单.双引号,需要反斜杠进行转义 let str='user\'s name'; // or let str=&quo ...