-
-
UDP协议实战
-
操作系统的发展史
-
多道技术
-
进程理论
编写一个从从客户端上传视频的CS架构软件
客户端
import socket import os import json import struct client = socket.socket() client.connect(('127.0.0.1', 8080)) movie_dir_path = r'C:\Users\10985\Desktop\SP\python基础day01\视频' 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 struct import json import socket server = socket.socket() server.bind(('127.0.0.1',8080)) server.listen(5) sock, addr = server.accept() # 接收固定长度的报头 header = sock.recv(4) # 接收字典的长度 dict_len = struct.unpack('i',header)[0] # 接收字典数据 dict_bytes = sock.recv('file_size') dict_data = json.loads(dict_bytes) # 接收真实数据 recv_size = 0 total_size = dict_data.get('file_size') file_name = dict_data.get('file_name') # 文件操作 with open(file_name,'wb') as f: while recv_size < total_size: data = sock.recv(1024) f.write(data) recv_size += len(data)
UDP协议
客户端
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)
服务端
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)
基于UDP实现简易版的qq
客户端
import socket client = socket.socket(type=socket.SOCK_DGRAM) server_addr = ('127.0.0.1', 8080) while True: msg = input('请输入想要聊天的内容>>>:').strip() msg = '来自客户端的消息:%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)

操作系统的发展史
"""
学习并发编程其实就是在学习操作系统 理论居多 实战少 都是封装的代码
"""
1.穿孔卡片
优势:一个人独占电脑
劣势:CUP利用率极低
2.联机批处理系统
一次性可以录入多个指令、缩短了cpu等待的时间、提高了CPU的利用率
3.脱机处理系统
是现代计算机核心部件的雏形、提高CPU的利用率
总结:操作系统的发展史其实就是提高CPU利用率的过程
多道技术
目的:提升CPU技术利用率 降低程序等待时间
'''强调:目前我们研究并发都是以计算机是单核的情况下:只有一个CPU'''
串行
多个任务排队执行 总耗时就是多个任务完整时间叠加
多道
利用空闲提前准备 缩短总的执行时间并且还能提高CPU利用率
"""
多道技术
1.空间上的复用
多个任务公用一套计算机硬件
2.时间上的服用
切换+保存状态
CPU在两种情况下会被拿走
1.程序遇到IO操作 CPU自动切走运行其他程序
2.程序长时间占用CPU 系统发现之后也会强行切走CPU 保证其他程序也可以使用
"""
进程理论
什么是程序、什么是进程
程序:一堆没有被执行的代码(死的)
进程:正在运行的程序(活的)
为什么有进程的概念
就是为了更加精确的描述出一些实际状态
进程调度算法发展史
1.先来先服务
对短作业任务不太友好
2.短作业优先
对长作业任务不太友好
3.时间片轮转法与多级反馈队列
时间片轮转法:先公平的将CPU分给每个人执行
多级反馈队列:根据作业长短的不同再合理分配CPU执行时间
'''目的就是为了能够让单核的计算机也能够做到运行多个程序'''
# 并发与并行
并发
看上去像同时在执行就可以称之为是并发
"""
饭店里边有很多桌客人(任务)
但是只有一个服务员(CPU)
如果让所有客人都感觉被服务员服务着(CPU执行)
让服务员在多桌客人之间快速的来回切换并保存状态即可
让CPU在多个程序之间利用多道技术来回切换+保存状态
单核肯定能够实现并发 但是不能实现并行
"""
并行
必须同一时间同时运行才可以称之为并行
"""单核计算机肯定不能实现并行 必须要有多个CPU"""
# 高并发与高并行
高并发:我们写的软件可以支持一个亿的并发量
一个亿的用户来了之后都可以感觉到自己被服务着
高并行:我们写的软件可以支持一个亿的并行量
上述话语的言外之意是计算机有一亿个CPU
# 同步与异步
同步
提交完任务之后原地等待任务的返回结果 期间不做任何事情
异步
提交完任务之后不愿等待任务的结果 直接去做其他事情 有结果自动提醒
# 阻塞与非阻塞
进程三状态图
就绪态:程序进入运行态之前肯定要处于就绪态
运行态:程序被CPU执行着
阻塞态:程序执行过程中有IO操作
'''
如果想要尽可能的提升程序执行效率
就要想办法让我们的程序一直处于就绪态和运行态(不要有IO操作)
'''
阻塞:阻塞态
非阻塞:就绪态、运行态
同步异步与阻塞非阻塞结合
同步异步:用来描述任务的提交方式
阻塞与非阻塞:用来描述任务的执行状态
上述两组属于两个不同概念 但是可以结合
同步阻塞:银行排队办理业务 期间不做任何事
同步非阻塞:银行排队办业务 期间喝水吃东西 但是人还在队列中
异步阻塞:在椅子上坐着 但是不做任何事
异步非阻塞:在椅子上坐着 期间喝水吃东西办公 (程序运行的极致)

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)