多进程

内容概括:

  一:单道与多道技术

  二:进程与程序

  三:并发与并行

  四:同步与异步

 

1、什么是单道?什么是多道技术?

  单道和多道其实都是一种cpu运行程序的方式

  -单道:指的是cpu从头到尾将一个程序执行完后,才能执行另外一个程序

  -多道:当一个程序执行时遇到阻塞,cpu空闲下来时,cpu会被调度到其它程序的运行中,提高cpu运行效率,可以近似实现多个程序同时执行

 

  多道与单道图解:

  cpu切换的三种方式:

  -当一个进程遇到阻塞时——time.sleep(),input(),文件操作(本质为线程遇到io)

    -提高了cpu的利用率

 

  -当一个进程执行时间过长时(本质为线程执行时间过长)

    -增加了cpu切换进程所用时间,降低了执行效率,但能避免一个程序执行时间过长,导致其它进程无法运行

 

  -当有一个优先级更高的进程要开启时

    -降低了执行效率,保证了用户的使用体验

  ps:cpu的切换是操作系统强制执行的

 

  cpu执行程序的三状态图

 

  cpu调度算法

  -先进先执行算法:

    对长作业有利,对短作业不利

  -短作业优先算法:

    对短作业有利,对长作业无益,无法实现并发效果

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

    多个进程同时执行,会被cpu执行相同时间(一个时间片,假设为3秒),三秒之间,进程A执行完毕,资源释放;三秒后,进程B与C未完成,进入下一个时间片(假设为2秒),在这两秒内,进程B执行完毕,资源释放。进程C未完成进入下一个时间片(假设时间为1秒),最后一秒内,进程C执行完毕,资源释放。

    需要注意的是,时间片越往下优先级越低,如果在进程A结束,进程B与进程C还在第二个时间片运行时,启动了新的进程,新的进程会被放入第一层时间片,cpu会抛弃进程B与C,优先执行新进程

 

    图解

 

2、什么是进程?什么是程序?

  -程序是“死”的,指的是存储在硬盘上一串关联的代码

  -进程是“活”的,指的是将硬盘上的程序代码提取到内存中运行的代码

  ps:程序与进程的概念并不严格,通常,程序可以指进程。

 

  开启进程的两种方式:

  一:

from multiprocessing import Process

def task(number):
    print('子进程{}下任务'.format(number))

p = Process(target = task, args=("2",))
p.start()  # 向操作系统发送请求
print('')

  二:利用类的继承与run方法(不常用)

 

复制代码
from multiprocessing import Process
class MyProcess(Process):
    def run(self):
        print('你好')

if __name__ == '__main__':
    p = MyProcess()
    p.start()
    print('世界')
复制代码

  注意:windows系统下,必须在执行进程前加入 if __name__ == "__main__"语句,否则会报类似循环导入的错误

  python开启进程的方式类似于模块导入,也就是将主文件的代码执行一份,放到一个新的内存空间中,如果没有上面的语句,子进程也能开启自己的进程,导致类似的循环导入

  所以必须进程主从文件的判断

 

  进程的join方法:

    要想主文件语句在子进程执行结束之后再执行,就要使用join方法

    以上述代打为准,看一下没有join语句会发生什么?

    执行结果:

        世界

        你好

    原因参考同步异步

 

    加入join后:

复制代码
from multiprocessing import Process
class MyProcess(Process):
    def run(self):
        print('你好')

if __name__ == '__main__':
    p = MyProcess()
    p.start()
    p.join()
    print('世界')
复制代码

    执行结果:

        你好

        世界

 

题目1:

复制代码
from multiprocessing import Process
import time


def task(i, t):
    print('任务开始{}'.format(i))
    time.sleep(t)
    print('任务结束{}'.format(i))


if __name__ == '__main__':
    p1 = Process(target=task, args=('1', 1,))
    p2 = Process(target=task, args=('1', 2,))
    p3 = Process(target=task, args=('1', 3,))
    start_time = time.time()
    p1.start()
    p2.start()
    p3.start()
    p1.join()
    p2.join()
    p3.join()
    end_time = time.time()
    print('结束时间为{}'.format(end_time - start_time))
复制代码

 

题目2:

复制代码
from multiprocessing import Process
import time


def task(i, t):
    print('任务开始{}'.format(i))
    time.sleep(t)
    print('任务结束{}'.format(i))


if __name__ == '__main__':
    start_time = time.time()
    for i in range(1,4):
        p = Process(target=task,args=(str(i),i))
        p.start()
        p.join()
    end_time = time.time()
    print('结束时间为{}'.format(end_time - start_time))
复制代码

 

  让主进程等待多个进程结束再执行的正确方式

复制代码
from multiprocessing import Process
import time


def task(i, t):
    print('任务开始{}'.format(i))
    time.sleep(t)
    print('任务结束{}'.format(i))


if __name__ == '__main__':
    start_time = time.time()
    p_list = []
    for i in range(1, 4):
        p = Process(target=task, args=(str(i), i))
        p.start()
        p_list.append(p)

    for p in p_list:
        p.join()
    end_time = time.time()
    print('结束时间为{}'.format(end_time - start_time))
复制代码

 

3、并行与并发的区别

  -并发:多个进程看似同时执行

    并发也可以理解为 切换 + 保存状态(是系统执行调度的最小单位)

  -并行:真正意义上多个进程同时执行(只有多核情况下,每一个线程都分配一个cpu,才可以称之为并行)

 

4、同步与异步

  同步与异步是两种不同的任务提交方式,或者说是执行代码的两种不同方式

  -同步:代码依次运行,当提交一个任务时,后续代码必须等待任务执行完毕,并返回结果后才继续执行

复制代码
import time

def task():
    time.sleep(5)
    print('任务执行并返回结果')

if __name__ == '__main__':
    task()
    print('等待任务执行完后才执行')
复制代码

    

  -异步:在没有遇到阻塞时,主文件代码一直执行,提交的任务会单独开辟内存空间和分配资源,独立执行

    异步提交的任务执行的结果,会利用异步回调机制进行处理

复制代码
from multiprocessing import Process

def task():
    print('任务执行并返回结果')

if __name__ == '__main__':
    p = Process(target=task,)
    p.start()
    print('任务没执行完,这段代码就执行了')
复制代码

 

posted @   口乞厂几  阅读(605)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示