zoukankan      html  css  js  c++  java
  • 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)
    超喜欢你
    
    
  • 相关阅读:
    HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别
    手动部署 Ceph Mimic 三节点
    Ceph 分布式存储架构解析与工作原理
    OpenStack 的单元测试
    OpenStack 虚拟机启动流程 UML 分析(内含 UML 源码)
    我非要捅穿这 Neutron(四)Open vSwitch in Neutron
    手动部署 OpenStack Rocky 双节点
    OpenStack Blazar 架构解析与功能实践
    基于 Open vSwitch 的 OpenFlow 实践
    OpenFlow/SDN 的缘起与发展
  • 原文地址:https://www.cnblogs.com/godlover/p/11997044.html
Copyright © 2011-2022 走看看