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)
超喜欢你

posted @ 2019-12-06 18:48  godlover  阅读(263)  评论(0编辑  收藏  举报