• 计算机基础知识33


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

    进程它是操作系统总最重要的概念,线程也是

    进程和线程都是有操作系统来调度使用的,我们程序员是不能控制的

    # 进程和程序是两码事、完全不一样

          程序:其实一个死的东西、一堆代码就是程序,它也没有生命周期

          进程:它是有生命周期的,这个任务做完,进程就不存在了

                  # 程序就是流程. 做菜的过程就是进程

                     厨师就是线程,谁干活谁就是线程,做菜完,进程就不存在了

    # 一个进程中至少要有一个线程,可以有多个线程

    协程就是程序员级别的,协程的调度它就是有我们程序员自己来调度的

              进程 >>> 线程  >>> 协程

              他们三个消耗资源的对比:进程 >>> 线程 >>> 协程

    # 单个CPU一次只能运行一个任务,打开浏览器的过程就是进程

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

    # CPU的工作机制:

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

    #  I/O密集型:会被时间所阻塞,不会占用大量的CPU资源,比如sleep(3)

       计算密集型:没有时间的大量消耗,不占用大量的时候,会占用大量的CPU资源

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

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

    进程的并行和并发概念

    并行:统一时刻同时运行

    并发:一段时间内看起来是同时运行

              CPU是单核时,同一时刻能不能做到同时执行多个任务,看上去是,来回切换

              CPU4核,执行2个任务,派哪两个核是由操作系统做

    """面试题:你对高并发有什么见解? 聊聊高并发? 你如何解决?"""

    同步异步阻塞和非阻塞

    # 老师:

           同步:每一次的运行都要依赖于上一步的结果       # 电话不挂,查到告诉
           异步:每次的运行结果不依赖于上次的结果          #  先挂,查到后再打电话告诉

    # 我:

            阻塞: # 电话不挂,一直等老师消息
           非阻塞:  # 先干自己的事,没有再打电话给老师询问消息

    异步+非阻塞 # 是效率最高的
                        同步+阻塞   # 是效率最低的 

    如何开启进程

    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__':
    6. p = Process(target=task) # 实例出来一个进程类, 让这个进程执行task任务
    7. p.start() # 真正的开启进程

    # 开启一个进程来执行task任务,真正执行的是线程,进程里面至少有一个线程

    # 操作系统开启进程

    Process类的参数

    进程的几个属性:1、进程名   2、进程号pid   kill

    # 查看就进程名称      print( p.name)

    # 改进程名字

    1. p.name = '这是新的进程名'
    2. print(p.name) # 这是新的进程名

    # 传参

    1. from multiprocessing import Process
    2. import time
    3. def task(name, age, gender):
    4. time.sleep(3)
    5. print("子进程的代码")
    6. if __name__ == '__main__':
    7. # 只是通知操作系统去开进程,有一定时间,开启进程其实消耗很大
    8. p = Process(target=task, name='process-2') # 子进程
    9. p.start() # 启动进程

    # 查看进程号:print(p.pid) # process id

    task任务里都是子进程,其余是主进程

               p.start()  # 真正的开启进程

               p.terminate() # 杀死进程,结束任务

               print(p.is_alive())   # True 看进程是否还在

               p.join() # 等待子进程的代码全部执行完毕,在走主进程的

    单进程

    如何开启多进程

    多进程就意味着可以同时做多个任务

    1. from multiprocessing import Process
    2. import time
    3. def task(name):
    4. with open('a.txt', 'a', encoding='utf-8') as f:
    5. f.write('helloworld')
    6. if __name__ == '__main__':
    7. for i in range(5): # 执行5次
    8. p=Process(target=task, kwargs={'name':'kevin'})
    9. p.start()

    # 理论上可以一直开进程,但是需要考虑资源的消耗情况

           # 先执行主进程,再执行子进程

    多进程中,想先执行子进程再主进程,p.join(),不能加在for循环中,不然是5秒

    1. from multiprocessing import Process
    2. import time
    3. def task(name):
    4. print("子进程")
    5. time.sleep(1)
    6. if __name__ == '__main__':
    7. start_time = time.time()
    8. ll = []
    9. for i in range(10):
    10. p=Process(target=task, kwargs={'name':'kevin'})
    11. p.start()
    12. ll.append(p)
    13. for j in ll: # 小的高并发情况,双11同时涌进大量客户
    14. j.join()
    15. print("主进程, 总时间:", time.time() - start_time)

    基于TCP协议的高并发程序

    一个服务端不能够同时给多个客户端发送消息

    1. import socket # python提供的socket模块
    2. def task(conn):
    3. while True:
    4. try:
    5. data = conn.recv(1024) # 括号里面写的是接收的字节数,最多接收1024个字节
    6. if len(data) == 0:
    7. continue
    8. print(data) # 还是bytes类型
    9. conn.send(data.upper()) # 服务端开始给客户端也发送一个数据
    10. except Exception as e:
    11. print(e)
    12. break
    13. conn.close()
    14. from multiprocessing import Process
    15. if __name__ == '__main__':
    16. server = socket.socket() # 默认是TCP协议
    17. server.bind(('127.0.0.1', 8001)) # 服务端绑定一个地址
    18. server.listen(1) # 监听,半连接池
    19. print('服务端正在准备接收客户端消息:')
    20. while True:
    21. conn, client_addr = server.accept() # 接收, 程序启动之后,会在accept这里夯住,阻塞
    22. p = Process(target=task, args=(conn,))
    23. p.start()

    今日思维导图: 

  • 相关阅读:
    循环神经网络-LSTM
    GitHub 又一开源神器!写代码、搜问题,全部都在「终端」完成!
    报表工具怎么选?JAVA开源工具那么好用,为什么大家还花钱买商用
    postman接口测试系列: 时间戳和加密
    【OpenCV 图像处理 Python版】OpenCV 简介及安装
    Ruby线程安全秘籍:深入探索并发编程的隐秘角落
    使用MySQL过程中忘掉实例名怎么办
    刷爆力扣之较大分组的位置
    Google Earth Engine(GEE)——快速建立一个10km的格网
    ​一文梳理ICML 2022中图机器学习热点和趋势
  • 原文地址:https://blog.csdn.net/qq_48064830/article/details/133883712