day25 多道技术 进程理论

多道技术

多道技术图解

多道技术重点知识

进程理论

程序与进程的区别

进程的调度

进程三状态图

两对重要概念

开启进程的两种方式

join方法

进程之间数据相互隔离

多道技术

单核实现并发的效果

必备的知识点:

并发

看起来像同时运行的就可以称之为并发

并行

真正意义上的同时执行

ps:

并行肯定算并发

单核的计算机不能实现并行,但是可以实现并发!!!

补充:我们直接假设单核就是一个核,干活的就一个人,不要考虑cpu里面的内核数

ps:明星出轨 ----> 星轨

<a name="duodaojishutujie"></a>多道技术图解

节省多个程序运行的总耗时。

![]()

<a name="duodaojishuzhongdianzhishi"></a> 多道技术重点知识

空间上的复用和时间上的复用

空间上的复用

多个程序公用一套计算机硬件

时间上的复用

例子:洗衣服30s,做饭50s,烧水30s

单道需要110s,多道只需要任务最长的那一个 节省切换时间

例子:边吃饭边玩游戏 保存状态

切换+保存状态

切换(cpu)分为两种情况:
    1、当一个程序遇到IO操作的时候,操作系统会剥夺该程序的cpu执行权限&lt;br&gt;&lt;/br&gt;     作用:提高了CPU的利用率,也不影响程序的执行效率&lt;br&gt;&lt;/br&gt;   2、当一个程序长时间占用CPU的时候,操作系统也会剥夺该程序的CPU执行权限&lt;br&gt;&lt;/br&gt;    作用:降低了程序的执行效率(原本时间+切换时间)

进程理论

<a name="chengxuyujinchengdequbie"></a>程序与进程的区别:

程序就是一堆躺在硬盘上的代码,是‘死’的

进程则表示程序正在执行的过程,是‘活’的

<a name="jinchegndediaodu"></a>进程的调度

先来先服务调度算法

特点:对长作业有利,对短作业无益

短作业优先调度算法

特点:对短作业有利,多长作业无益

时间片轮转法+多级反馈队列

![]()

<a name="jinchengsanzhuangtaitu"></a>进程三状态图

![]()

![]()

<a name="liangduizhongyaigainian"></a>两对重要概念

同步和异步

描述的是任务的提交方式&lt;br&gt;&lt;/br&gt;同步:任务提交之后,原地等待任务的返回结果,期间等待的过程中不做如何事情(干等)&lt;br&gt;&lt;/br&gt;    程序层面上表现出来的感觉就是卡住了&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;
异步:任务提交之后,不原地等待任务的返回结果,直接去做其他事情&lt;br&gt;&lt;/br&gt;    我提交的任务结果如何获取?&lt;br&gt;&lt;/br&gt;    任务的返回结果会有一个异步回调机制自动处理

阻塞非阻塞

描述的是程序的运行状态&lt;br&gt;&lt;/br&gt;阻塞:阻塞态&lt;br&gt;&lt;/br&gt;非阻塞:就绪态、运行态&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;理想状态:我们应该让我们写的代码永远处于就绪态和运行态之间切换

上述概念的组合:最高效的一种组合就是异步非阻塞

<a name="kaiqijinchengdeliangzhongfangshi"></a>开启进程的两种方式

定心丸:代码开启进程和线程的方式,代码书写基本是一样的,你学会了如何开启进程就学会了如何开启线程

方式一:

# 第一种
from multiprocessing import Process
import time

def task(name):
    print(&quot;%s is running&quot; % name)
    time.sleep(3)
    print('%s is over' % name)

if __name__ == '__main__':
    # 1、创建一个对象
    p = Process(target=task, args=('jason',))
    # 容器类哪怕里面有一个元素,建议一定要用逗号隔开
    # 2、开启进程
    p.start()  # 告诉操作系统帮你创建一个进程  异步
    print('主')

'''
windows操作系统下 创建进程一定要在main内创建
因为windows下创建进程类似于模块导入的方式
会从上往下依次执行代码
linux中则是直接将代码完整的拷贝一份
'''

方式二:

# 第二中方式 类的继承
from multiprocessing import Process
import time

class MyProcess(Process):
    def run(self):
        print('hello world')
        time.sleep(1)
        print('get out!')

if __name__ == '__main__':
    p = MyProcess()
    p.start()
    print('主')

总结:

创建进程就是在内存中申请一块内存空间将需要运行的代码丢进去
一个进程对应在内存中就是一块独立的内存空间
多个进程对应在内存中就是多块独立的内存空间
进程与进程之间数据默认情况下是无法直接交互,如果想交互可以借助于第三方模块,工具

<a name="joinfangfa"></a>join方法

join是让主进程等待子进程代码运行结束之后,再继续运行。不影响其他子进程的执行

from multiprocessing import Process
import time

def task(name,n):
    print(&quot;%s is running&quot; % name)
    time.sleep(n)
    print('%s is over' % name)

if __name__ == '__main__':
    # 方式一:
    1、创建一个对象
    p1 = Process(target=task, args=('jason',1))
    p2 = Process(target=task, args=('egon',2))
    p3 = Process(target=task, args=('tank',3))
    # 容器类哪怕里面有一个元素,建议一定要用逗号隔开
    # 2、开启进程
    start_time = time.time()
    p1.start()  # 告诉操作系统帮你创建一个进程  异步
    p2.start()
    p3.start()  # 仅仅是告诉操作系统要创建进程
    # p.join()  # 主进程等待子进程p运行结束之后在继续往后执行
    p1.join()
    p2.join()
    p3.join()
    print('主',time.time() - start_time)

    # 方式二:
    start_time = time.time()
    p_list = []
    for i in range(1,4):
        p = Process(target=task,args=('子进程%s'%i,i))
        p.start()
        p_list.append(p)
    for p in p_list:
        p.join()
    print('主', time.time() - start_time)

<a name="jinchengzhijinashujuxinghugeli"></a> 进程之间数据相互隔离(默认情况下)

from multiprocessing import Process

money = 100

def task():
    global money  # 局部修改全局
    money = 666
    print('子',money)

if __name__ == '__main__':
    p = Process(target=task)
    p.start()
    p.join()
    print(money)

# 子 666
# 100

声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。

本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。

我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。