udp协议与并发编程
udp协议
udp协议:称之为数据包协议
特点:
1.不需要建立连接
2.不需要知道对方是否收到数据
3.数据不安全
4.传输速度快
5.能支持并发
6.不会粘包
7.无需先启动服务端再启动客户端
优点:
传输速度快
能支持并发
不会粘包
缺点:
数据不安全,容易丢失
应用场景:早期的qq聊天室
TCP协议(称为流式协议):
优点:
数据安全
缺点:
传输速度慢
粘包
2.并发编程
1).操作系统发展史
1.1穿孔卡片
读取数据速度特别慢
cpu的利用率极低
单用户(一份代码)使用
1.2批处理
读取数据速度特别慢
cpu的利用率极低
联机(多份代码)使用
效率还是很低
1.3脱机批处理(现代操作系统的设计原理)
读取数据速度提高
cpu的利用率提高
2)多道技术(基于单核背景下产生的):
单道: 一条道路
eg: a和b需要使用cpu,a先使用,b等待a使用完,b才能使用cpu
多道:
eg:a,b需要使用cpu,a先使用,b等待a,直到a进入“IO或执行时间过长”,a会(切换+保存状态),然后b可以使用cpu,待b执行遇到“io或执行时间过长”,再将cpu执行权限交给a,直到两个程序结束
空间上的复用:
多个程序使用一个cpu
时间上的复用:
切换 + 保存状态
当执行程序遇到io时,操作系统会将cpu的执行权限剥夺
优点:cpu的执行效率提高
当执行程序执行时间过长时,操作系统会将cpu的执行权限剥夺
缺点: 程序的执行效率低
并行与并发
并发:
再单核情况下,一个程序先执行,遇到io或运行时间过长时,cpu执行权限换人,另一个程序开始执行,看起来像是在同时运行
并行:
在多核(多个cpu)的情况下,执行多个程序,多个程序可以同时执行。他们是真正意义上的同时运行,但是当程序大于cpu的数量时,还是会出现并发
在单核的情况下是否能实现并行?
不行
在多核的情况下是否会出现并发?
会
进程:
什么是进程?
进程是一个资源单位
进程与程序?
程序:一对代码文件
进程:执行代码的过程,称之为进程
进程调度:
1.先来先服务调度算法
缺点:执行效率低
2.短作业优先调度算法
执行时间短,则会先调度
缺点:导致执行时间长的程序,需要等待所有时间短的程序执行完以后,才可以执行
3.时间片轮转法
操作系统指定时间,平均分配给所有的程序
4.多级反馈队列
一级队列:优先级最高,先执行队列中的程序
二级队列:优先级第二
三级队列:pass
。。。
同步与异步:
同步与异步指的是”提交任务的方式“
同步(串行):
两个程序,第二个程序必须要等第一个程序执行完毕后才能提交任务
异步(并发):
两个程序,第二个程序没必要等第一个程序执行完以后再提交任务
阻塞与非阻塞:
阻塞(等待):
凡是遇到IO都会阻塞
IO:
input()
output()
time.sleep(3)
文件的读写
数据的传输
非阻塞(不等待):
除了IO都是非阻塞
总结:
同步与异步:指的是提交任务的方式
阻塞与非阻塞:进程的状态
异步非阻塞:cpu的利用率最大化
创建进程的两种方式:
# 第一种:直接调用Process
# from multiprocessing import Process
# import time
def task(name):
print(f'start...{name}的子进程')
time.sleep(3)
print(f'end...{name}的子进程')
# if __name__ == '__main__':
# target = 任务(函数地址) ————》创建子进程
# 这里异步提交了三个任务
# p_obj1 = Process(target=task, args=('sean',))
# p_obj1.start()
# p_obj1.join()
# p_obj2 = Process(target=task, args=('jason',))
# p_obj2.start()
# p_obj2.join()
# p_obj3 = Process(target=task, args=('tank',))
# p_obj3.start()
# p_obj3.join()
#
# print('正在执行当前主程序!')
# list1 = []
# for i in range(20):
# p_obj = Process(target=task, args=('tank', ))
# p_obj.start()
# list1.append(p_obj)
#
# for line in list1:
# line.join()
#
# print('正在执行当前主程序!')
#
# 第二种方式
from multiprocessing import Process
import time
class MyProcess(Process):
# 这里是重写Process里面的run方法
def run(self):
print(f'start...{self.name}的子进程')
time.sleep(3)
print(f'end...{self.name}的子进程')
if __name__ == '__main__':
list1 = []
for line in range(5):
obj = MyProcess()
obj.start()
list1.append(obj)
for obj in list1:
obj.join()
print('执行了主程序!')
udp协议下的群聊
server
import socket
server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(
('127.0.0.1', 9919)
)
print('server is running !')
while True:
data, addr = server.recvfrom(1024)
print(addr)
print(data.decode('utf-8'))
client
import socket
client = socket.socket(type=socket.SOCK_DGRAM)
address = ('127.0.0.1', 9919)
print('client is running !')
while True:
msg = input('client:').strip().encode('utf-8')
client.sendto(msg, address)
server端结果:
server is running !
('127.0.0.1', 57869)
hello
('127.0.0.1', 58019)
大宝贝
('127.0.0.1', 58020)
小宝贝
('127.0.0.1', 58021)
我爱你
('127.0.0.1', 58022)
超喜欢你