• day36


    今日内容概要

    • 进程基础(操作系统中的概念)

    • 进程调度算法(四种算法)

    • 进程的并行和并发的概念

    • 同步异步阻塞非阻塞的概念

    • 创建进程(进程类Process)

    • Process类的参数

    • Process类的方法

    • 如何开启多进程

    • 基于TCP协议的高并发程序

    进程基础

    进程它是操作系统中最重要的概念,也是最基本的一个概念
    线程也是操作系统中的一个很重要的概念

    进程和线程都是有操作系统来调度使用的,我们程序员是不能控制的,这里就设计到调度算法

    什么是进程?什么是线程?什么是程序?
    进程和程序是两码事、完全不一样
    程序:其实是一个死的东西、一堆代码就是程序,他也没有生命周期
    进程:它是有生命周期的,这个任务做完,进程就不存在了

    在一个进程中,可以有多个线程,一个进程中只有一个线程,也是可以的。
    一个进程中至少要有一个线程
    进程和线程他们都是有操作系统来调度的,程序员级别是没办法来调度的,协程就是程序员级别的,协程的调度它就是有我们程序员自己来调度的,在操作系统中是没有协程这个概念的,是我们人为的抽象出来的

    进程》》》线程》》》协程
    消耗资源对比:进程》》》线程》》》协程

    单个cpu一次只能运行一个任务

    进程调度算法

    cpu的工作机制:
         1.遇到I/O的时候,cpu会交出执行权限
         2.当cpu遇到耗时比较长的时候,也会自动交出执行权限,切换到其他任务

    I/O密集型
        他会被时间所阻塞,不会占用大量的cpu资源,比如sleep(3)
    计算机密集型
        不占用大量的时候, 会占用大量的cpu资源,这种情况就是计算机密集型,没有时间的大量消耗

    1. for i in range(10000000):
    2. i+=1

    一、先来先服务调度算法
    二、短作业优先调度算法
    三、时间片轮转法
    四、多级反馈队列

    进程的并行和并发概念

    并行:统一时刻同时运行
    如果cpu是单核的,同一时刻能不能做到同时执行多个任务,不能
    如果是多核,就可以同一时刻做到
    核是2,最多同一时刻最多执行2个任务
    核是4,同一时刻最多执行4个任务

    并发:一段时间内看起来是同时运行
        如果是单核的cpu,听课、看视频、浏览网页能不能一起操作,是可以的,cpu的切换达到的

    同步 异步 阻塞和非阻塞

    所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。
    换句话说,就是由*调用者*主动等待这个*调用*的结果。

    而异步则是相反,*调用*在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用。

    典型的异步编程模型比如Node.js

    阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.

    阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
    非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程

    如何创建进程

    1. from multiprocessing import Process
    2. def task():
    3. with open('a.txt','w',encoding='utf-8') as f:
    4. f.write('helloworld')
    5. if __name__ == '__main__': # windows平台上必须写在这个里面
    6. p = Process(target=task) # 实例出来一个进程类,让这个进程执行task任务
    7. p.start() # 真正的开始进程

    process类参数

    1. from multiprocessing import Process
    2. def task(name, age, gender):
    3. print(name, age, gender)
    4. with open('a.txt', 'w', encoding='utf-8') as f:
    5. f.write('helloworld')
    6. """现在这个写法还没有开启进程"""
    7. """Windows平台上必须写在这个里面"""
    8. if __name__ == '__main__':
    9. """
    10. group=None, target=None, name=None, args=(), kwargs={},
    11. *, daemon=None
    12. """
    13. p = Process(target=task, name='process-2', args=(), kwargs={'name':'jerry', 'age':20, 'gender':'male'}) # 实例出来一个进程类, 让这个进程执行task任务
    14. p.start() # 真正的开启进程
    15. # 操作系统是负责把这个进程开起来
    16. # 开启一个进程来执行task任务,真正是谁在执行这个任务,是线程,进程里面至少要有一个线程
    17. """进程的几个属性:1. 进程名 2. 进程号pid kill """
    18. # 如何查看进程的名称
    19. print(p.name) # Process-1
    20. # 怎么改进程名字
    21. # p.name = '这是新的进程名'
    22. # print(p.name) # 这是新的进程名

     

    Process类的几个方法

    1. from multiprocessing import Process
    2. import time
    3. def task(name, age, gender):
    4. print(name, age, gender)
    5. # with open('a.txt', 'w', encoding='utf-8') as f:
    6. # f.write('helloworld')
    7. time.sleep(3)
    8. print("子进程的代码")
    9. """现在这个写法还没有开启进程"""
    10. """Windows平台上必须写在这个里面"""
    11. if __name__ == '__main__':
    12. """
    13. group=None, target=None, name=None, args=(), kwargs={},
    14. *, daemon=None
    15. """
    16. # 子进程 主进程
    17. """只是通知操作系统去开进程,并不是立马把进程开起来,他是需要消耗一定的时间的,侧面的反应了开启进程其实消耗很大"""
    18. p = Process(target=task, name='process-2', args=(), kwargs={'name':'jerry', 'age':20, 'gender':'male'}) # 实例出来一个进程类, 让这个进程执行task任务
    19. p.start() # 真正的开启进程
    20. # 操作系统是负责把这个进程开起来
    21. # 开启一个进程来执行task任务,真正是谁在执行这个任务,是线程,进程里面至少要有一个线程
    22. """进程的几个属性:1. 进程名 2. 进程号pid kill """
    23. # 如何查看进程的名称
    24. # print(p.name) # Process-1
    25. # 怎么改进程名字
    26. # p.name = '这是新的进程名'
    27. # print(p.name) # 这是新的进程名
    28. ## 如何查看进程号
    29. # print(p.pid) # process id
    30. # print(p.is_alive()) # True
    31. # p.terminate() # 杀死进程,结束任务
    32. # import time
    33. # time.sleep(1)
    34. # print(p.is_alive())
    35. p.join() # 等待子进程的代码全部执行完毕,在走主进程的
    36. print("主进程的代码执行完毕")

    如何开启多进程

    1. 多进程就意味着可以同时做多个任务嘛, 一个进程做一个任务,多个进程肯定是做多个任务
    2. from multiprocessing import Process
    3. import time
    4. def task(name):
    5. # print(name)
    6. # with open('a.txt', 'a', encoding='utf-8') as f:
    7. # f.write('helloworld')
    8. print("子进程")
    9. time.sleep(1)
    10. if __name__ == '__main__':
    11. """理论上你是可以一直开进程,单是你需要考虑资源的消耗情况"""
    12. start_time = time.time()
    13. ll = []
    14. for i in range(10):
    15. p=Process(target=task, kwargs={'name':'kevin'})
    16. p.start()
    17. # p.join() #
    18. ll.append(p)
    19. for j in ll:
    20. j.join()
    21. print("主进程, 总时间:", time.time() - start_time)

    基于TCP协议的高并发程序

    1. 一个服务端不能够同时给多个客户端发送消息
    2. import socket # python提供的socket模块
    3. def task(conn):
    4. while True:
    5. try:
    6. # 异常了一个bug,粘包现象
    7. data = conn.recv(1024) # 括号里面写的是接收的字节数,最多接收1024个字节
    8. if len(data) == 0:
    9. continue
    10. print(data) # 还是bytes类型
    11. # 服务端开始给客户端也发送一个数据
    12. conn.send(data.upper())
    13. except Exception as e:
    14. print(e)
    15. break
    16. conn.close()
    17. from multiprocessing import Process
    18. if __name__ == '__main__':
    19. # 1. 买手机
    20. # SOCK_STREAM ====> 代表的是TCP协议
    21. # socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    22. # socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # udp协议
    23. server = socket.socket() # 默认是TCP协议
    24. # 2. 买手机卡
    25. # '0.0.0.0' =====> 代表允许任何的ip链接
    26. # server.bind(('0.0.0.0', 8000)) # 服务端绑定一个地址
    27. server.bind(('127.0.0.1', 8001)) # 服务端绑定一个地址
    28. # 3. 开机
    29. server.listen(1) # 监听,半连接池
    30. print('服务端正在准备接收客户端消息:')
    31. while True:
    32. conn, client_addr = server.accept() # 接收, 程序启动之后,会在accept这里夯住,阻塞
    33. p = Process(target=task, args=(conn,))
    34. p.start()

  • 相关阅读:
    首字母小写的标题在哪里编程
    MySQL外键
    关于构造方法
    笔记/日记应用 memos
    java高级--SpringBoot篇
    园区高效管理的“神器”--快鲸智慧园区管理系统
    Vue3.0 VCA语法糖 <script setup> :VCA模式
    python每日一题【剑指 Offer 46. 把数字翻译成字符串】
    第28章 锁
    2、用户态和内核态
  • 原文地址:https://blog.csdn.net/qq_67257222/article/details/133883633