欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

udp协议,进程(同步,异步)

程序员文章站 2024-01-29 15:43:58
udp协议与进程 一、udp协议 QQ聊天室 二、理论知识 必备知识 三、同步演示 代码 串行 异步提交三个进程 同步提交三个进程 异步提交多个进程 方式二 ......

udp协议与进程

一、udp协议

  • qq聊天室
#- sever
import socket

#socket.sock_dgram--->upd协议

sever = socket.socket(type=socket.sock_dgram)

#服务端需要绑定一个地址,让别人知道你在哪里
sever.bind(
    ('127.0.0.1', 9002)
)

while true:

    #发送数据给服务端的用户地址
    data, addr = sever.recvfrom(1024)

    print(addr)
    print(data.decode('utf-8'))


#- client
import socket

client = socket.socket(type=socket.sock_dgram)

address = ('127.0.0.1', 9002)

while true:

    msg = input('client---->sever:').strip().encode('utf-8')

    client.sendto(msg, address)

('127.0.0.1', 57697)
热巴
('127.0.0.1', 59959)
热巴真美啊
('127.0.0.1', 59960)
热巴亚峰啊

   

二、理论知识

  • 必备知识
1、udp协议(了解)
    称之为数据包协议

    特点:
        1) 不需要建立链接
        2) 不需要知道对方是否收到
        3) 数据不安全
        4) 传输速度快
        5) 能支持并发
        6) 不会粘包
        7) 无需先启动服务端再启动客户端


    优点:
        - 传输速度快
        - 能支持并发
        - 不会粘包

    缺点:
        - 数据不安全,容易丢失

    应用场景:早期的qq聊天室


- tcp协议(称为流式协议)

    优点:
        - 数据安全

    缺点:
        - 传输速度慢
        - 粘包

面试可能会问:tcp与udp的区别,简述优缺点即可(*******)


2、并发编程

    1)操作系统发展史
        - 1.1 穿孔卡片
            - 读取数据速度特别慢
            - cpu的利用率极低
            - 单用户(一份代码使用)

![](https://img2018.cnblogs.com/blog/1843751/201912/1843751-20191206195817239-1051109546.png)




        - 1.2 批处理
            - 读取数据速度特别慢
            - cpu的利用率极低
            - 联机(多份代码使用)
            - 效率还是很低

        - 1.3 脱机批处理(现代操作系统的设计原理)
            - 读取数据速度高
            - cpu的利用率提高

    2) 多道技术(基于单核背景下产生的):
        - 单道:一条道走到黑 ---> 串行
        - 比如:a,b需要使用cpu,a先使用,b等待a使用完毕后才能使用cpu


        - 多道:(*******)
            - 比如:a,b需要使用cpu,a先使用,b等待a,直到a进入“io或执行时间过长”
                a会(切换 + 保存),然后b可以使用cpu,待b执行遇到“io或执行时间过长”
                再将cpu执行权限交给a,直到两个程序结束

            - 空间的复用(*******)
                多个程序使用一个cpu

            - 时间上的复用(*******)
                切换 + 保存状态

                1)当执行程序遇到io时,操作系统会将cpu的执行权限剥夺。

                    优点:
                        - cpu的执行效率提高

                2)当执行时间过长时,操作系统会将cpu的执行权限剥夺

                    缺点:
                        - 程序的执行效率低
![](https://img2018.cnblogs.com/blog/1843751/201912/1843751-20191206195843026-150840510.png)




        - 并发与并行;(*******)
            - 并发(一个人):
                在单核(一个cpu)情况下,当执行两个a,b程序时,a先执行,当a遇到io时,b开始争抢cpu的权限,再让b执行,他们看起来像同时运行。
            - 并行(两个或多个人):
                在多核(多个cpu)的情况下,当执行两个a,b程序时,a与b同时执行。他们是真正意义上的运行。


            面试题:在单核情况下能否实现并行?答:不行


    3)进程
        1、什么是进程?
            进程是一个资源单位

        2、进程与程序:
            - 程序:一堆代码文件
            - 进程:执行代码的过程,称之为进程

        3、进程调度(了解)
            1)先来先服务调度算法(了解)
                - 比如程序:a,b,若a先来,则让a先服务,待a服务完成以后,b再服务。
                - 缺点:执行效率低

            2)短作业优先调度算法优先(了解)
                - 执行时间短,则先调度。
                - 缺点:导致执行时间长的程序,需要等待所有短时间的程序执行完毕后,才能执行

            现代操作系统的进程调度算法:时间片轮法 + 多级反馈队列(知道)

            3)时间片轮法
                - 比如同时有10个程序需要执行,操作系统会给你10秒,然后时间片轮法会将10秒分成10等分。

            4)多级反馈队列:
                1级队列:优先级最高,先执行队列中的程序
                2级队列:优先级其次
                3级队列:以此类推

    4)同步与异步(*******)
        同步与异步 指的是 “提交任务的方式”。

        同步(相当于串行):
            两个a,b程序都需要提交并执行,假如a先提交执行,b必须等a执行完毕后,才能提交任务。

        异步(相当于并发):
            两个a,b程序都需要提交并执行,假如a先提交并执行,b无需等a执行完毕,就可以直接提交任务。


    5)阻塞与非阻塞(*******):
        - 阻塞(等待):
            - 凡是遇到io都会阻塞
                - io:
                    input()
                    output()
                    time.sleep(3)
                    文件的读写
                    数据的传输
                    
        - 非阻塞(不等待):
            - 除了io都是非阻塞(比如:从1+1开始计算到100万)
            
    6)进程的三种状态(*******):
        - 就绪态:
            -同步与异步
        - 运行态:程序的执行时间过长 ---->将程序返回给就绪态
            -非阻塞
            
        - 阻塞态:
            - 遇到io
 
![](https://img2018.cnblogs.com/blog/1843751/201912/1843751-20191206195906574-1537643301.png)



           
   面试题:阻塞与同步是一样的吗?非阻塞与异步是一样的吗?
    - 同步与异步:提交任务的方式
    
    - 阻塞非阻塞:进程的状态
    
    - 异步与非阻塞:--->cpu的利用率最大化
    
    7)创建进程的两种方式:

三、同步演示

  • 代码
import time

def func():
    print('start...')
    time.sleep(3)
    print('end...')


if __name__ == '__main__':

    #任务一:
    func()

    #任务二:
    print('程序结束')
#同步执行:任务一执行完以后才会执行任务二
start...
end...
程序结束
  • 串行
from multiprocessing import process
import time

#方式一:直接调用process

def task():   #任务  #name== 'jason_sb'

    print(f'start....的子进程')
    time.sleep(3)
    print(f'end...的子进程')

if __name__ == '__main__':
    #target = 任务(函数地址)---> 创建一个子进程
    #异步提交三个任务
    p_obj = process(target=task)

    p_obj.start()  #告诉操作系统,去创建一个子进程

    p_obj.join()  #告诉操作系统,等待子进程结束以后,再结束,此时相当于串行

    print('正在执行当前主进程')

start....的子进程
end...的子进程
正在执行当前主进程
  • 异步提交三个进程
# #异步提交三个任务
# #方式一:直接调用process
#
# def task(name):   #任务  #name== 'jason_sb'
#
#     print(f'start....{name}的子进程')
#     time.sleep(3)
#     print(f'end...{name}的子进程')
#
# if __name__ == '__main__':
#     #target = 任务(函数地址)---> 创建一个子进程
#     #异步提交三个任务
#     p_obj1 = process(target=task, args=('jason_sb',))
#     p_obj2 = process(target=task, args=('sean_sb',))
#     p_obj3 = process(target=task, args=('tank_sb',))
#
#
#     p_obj1.start()  #告诉操作系统,去创建一个子进程
#     p_obj2.start()  #告诉操作系统,去创建一个子进程
#     p_obj3.start()  #告诉操作系统,去创建一个子进程
#
#
#     print('正在执行当前主进程')
#
# # start....jason_sb的子进程
# # start....sean_sb的子进程
# # start....tank_sb的子进程
# # end...jason_sb的子进程
# # end...sean_sb的子进程
# # end...tank_sb的子进程
  • 同步提交三个进程
#同步提交三个
def task(name):   #任务  #name== 'jason_sb'

    print(f'start....{name}的子进程')
    time.sleep(3)
    print(f'end...{name}的子进程')


if __name__ == '__main__':
    task(1)
    task(2)
    task(3)


# start....1的子进程
# end...1的子进程
# start....2的子进程
# end...2的子进程
# start....3的子进程
# end...3的子进程
  • 异步提交多个进程
异步执行多个进程
def task(name):   #任务  #name== 'jason_sb'

    print(f'start....{name}的子进程')
    time.sleep(3)
    print(f'end...{name}的子进程')

if __name__ == '__main__':

    list1 = []

    for line in range(10):
        p_obj = process(target=task, args=('jason_sb', ))
        p_obj.start()
        list1.append(p_obj)

    for obj in list1:
        obj.join()

    print('主进程')

start....jason_sb的子进程
start....jason_sb的子进程
start....jason_sb的子进程
start....jason_sb的子进程
start....jason_sb的子进程
start....jason_sb的子进程
start....jason_sb的子进程
start....jason_sb的子进程
start....jason_sb的子进程
start....jason_sb的子进程
end...jason_sb的子进程
end...jason_sb的子进程
end...jason_sb的子进程
end...jason_sb的子进程
end...jason_sb的子进程
end...jason_sb的子进程
end...jason_sb的子进程
end...jason_sb的子进程
end...jason_sb的子进程
end...jason_sb的子进程
主进程
  • 方式二
#方式二:
from multiprocessing import process
import time

class myprocess(process):
    def run(self):
        print(f'start...{self.name}的子进程')
        time.sleep(3)
        print(f'end...{self.name}的子进程')

if __name__ == '__main__':
    list1 = []

    for line in range(10):
        obj = myprocess()
        obj.start()
        list1.append(obj)

    for obj in list1:
        obj.join()

    print('主进程...')

# start...myprocess-1的子进程
# start...myprocess-2的子进程
# start...myprocess-4的子进程
# start...myprocess-5的子进程
# start...myprocess-3的子进程
# start...myprocess-6的子进程
# start...myprocess-8的子进程
# start...myprocess-7的子进程
# start...myprocess-9的子进程
# start...myprocess-10的子进程
# end...myprocess-1的子进程
# end...myprocess-2的子进程
# end...myprocess-4的子进程
# end...myprocess-5的子进程
# end...myprocess-3的子进程
# end...myprocess-6的子进程
# end...myprocess-7的子进程end...myprocess-8的子进程
# end...myprocess-9的子进程
# end...myprocess-10的子进程
# 主进程...