Python36days

发布时间 2023-10-17 19:45:53作者: 拆尼斯、帕丁顿

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

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

进程的并行和并发的概念

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

创建进程(进程类Process)

Process类的参数

Process类的方法

如何开启多进程

基于TCP协议的高并发程序

———————————————————————————————————————————————————————————————————————————————————

进程是计算机系统中正在运行的程序的实例。它是操作系统对程序执行的基本单位,可以看作是程序在执行过程中的动态表现。每个进程都有自己的内存空间、代码、数据和执行状态。多个进程可以同时运行在计算机系统中。

从不同的角度,进程可以有不同的定义,比较典型的定义有:

1)进程是程序的一次执行过程。
2)进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
3)进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。
引入进程实体的概念后,我们可以把传统操作系统中的进程定义为:“进程是进程实体的运行过程,是系统进行资源配和调度的一个独立单位
**************************************************

 

进程和线程是由操作系统来调度,程序员无法调动,只可调动协程

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

进程: 是一个执行的过程,有生命周期,  当任务做完,进程就不存在了。
    且在一个进程中 可以有多个线程 

1.进程包含线程,一个进程中至少有一个线程
2.进程是系统分配资源的最小单位,线程是cpu调度的最小单位
3.进程状态的改变比线程改变状态花费的时间更多;所以创建一个线程比创建一个进程的时间少
4.每个进程都有自己的独立的虚拟地址空间,对于一个进程中的多个线程来说,可以共享该进程的内存空间
5.一个进程挂了,不会影响其他的进程,一个进程中的一个线程挂了,可能会导致整个进程挂掉;

消耗资源对比:

进程 ——》线程——》协程

 

——————————————————————————————————————————————————————————————————————————————————————

CPU的工作机制

  遇到I/O的时候,CPU会交出执行权限

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

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

计算密集型   :[不占用大量的时候,会占用大量的CPU资源]


一、先来先服务调度算法
先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。由此可知,本算法适合于CPU繁忙型作业,而不利于I/O繁忙型的作业(进程)。

二、短作业优先调度算法
短作业(进程)优先调度算法(SJ/PF)是指对短作业或短进程优先调度的算法,该算法既可用于作业调度,也可用于进程调度。但其对长作业不利;不能保证紧迫性作业(进程)被及时处理;作业的长短只是被估算出来的。

三、时间片轮转法
时间片轮转(Round Robin,RR)法的基本思路是让每个进程在就绪队列中的等待时间与享受服务的时间成比例。在时间片轮转法中,需要将CPU的处理时间分成固定大小的时间片,例如,几十毫秒至几百毫秒。如果一个进程在被调度选中之后用完了系统规定的时间片,但又未完成要求的任务,则它自行释放自己所占有的CPU而排到就绪队列的末尾,等待下一次调度。同时,进程调度程序又去调度当前就绪队列中的第一个进程。

四、多级反馈队列

应设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,第二个队列次之,其余各队列的优先权逐个降低。该算法赋予各个队列中进程执行时间片的大小也各不相同,在优先权愈高的队列中,为每个进程所规定的执行时间片就愈小。
——————————————————————————————————————————————————————————————————————————————————————

并行:多个程序同时运行
  如果CPU是单核,同一时刻不能做到同时执行多个版本
  如果是多核的,,同一时刻就能做到

  如果CPU是2核,同一时刻最多执行 2个任务

并发:伪并行,看起来是同时并行,其实质是利用了多道技术

  如果是单核 的CPU,听歌,看视频 ,浏览网页可以一起操作,只要互相切换就好了

 

无论是并行还是并发,在用户眼里看起来都是同时运行的,不管是线程还是进程,都是只是一个任务,真正干活的是CPU,而同一个CPU在同一时刻只能执行一个任务。

——————————————————————————————————————————————————————————————————————————————————————

同步和异步

所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列。

例子

    第一种 :选择排队等候;

    第二种 :选择取一个小纸条上面有我的号码,等到排到我这一号时由柜台的人通知我轮到我去办理业务了;

    第一种:前者(排队等候)就是同步等待消息通知,也就是我要一直在等待银行办理业务情况;

    第二种:后者(等待别人通知)就是异步等待消息通知。在异步消息处理中,等待消息通知者(在这个例子中就是等待办理业务的人)往往注册一个回调机制,在所等待的事件被触发时由触发机制(在这里是柜台的人)通过某种机制(在这里是写在小纸条上的号码,喊号)找到等待该事件的人。

三、阻塞和非阻塞

例子

继续上面的那个例子,不论是排队还是使用号码等待通知,如果在这个等待的过程中,等待者除了等待消息通知之外不能做其它的事情,那么该机制就是阻塞的,表现在程序中,也就是该程序一直阻塞在该函数调用处不能继续往下执行。

相反,有的人喜欢在银行办理这些业务的时候一边打打电话发发短信一边等待,这样的状态就是非阻塞的,因为他(等待者)没有阻塞在这个消息通知上,而是一边做自己的事情一边等待。

注意:同步非阻塞形式实际上是效率低下的,想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有。如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的;而异步非阻塞形式却没有这样的问题,因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不同的操作中来回切换。

同步/异步和阻塞/非阻塞

1.异步阻塞形式

如果在银行等待办理业务的人采用的是异步的方式去等待消息被触发(通知),也就是领了一张小纸条,假如在这段时间里他不能离开银行做其它的事情,那么很显然,这个人被阻塞在了这个等待的操作上面。

异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞。

2.同步非阻塞形式

想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有,如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的。

3.异步非阻塞形式

因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不同的操作中来回切换。

比如说,这个人突然发觉自己烟瘾犯了,需要出去抽根烟,于是他告诉大堂经理说,排到我这个号码的时候麻烦到外面通知我一下,那么他就没有被阻塞在这个等待的操作上面,自然这个就是异步+非阻塞的方式了。

——————————————————————————————————————————————————————————————————————————————————————

创建进程(进程类Process)

 multiprocessing.Process() 创建多进程
multiprocessing是Python的一个标准模块,它提供了一组用于处理进程的工具。这个模块可以很方便地创建和管理进程。

使用内置模块 multiprocessing.Process() 创建多进程,它接收两个参数:

进程函数名,注意不要传入调用。
进程函数的参数,以元组的形式传入,若不需要参数可以不指定

 

 

 

 

例二**********************************************

 

 

————————————————————————————————————————————————————————————————————————————————————————