多进程_多进程处理是什么意思

多进程_多进程处理是什么意思内容概括: 一:单道与多道技术 二:进程与程序 三:并发与并行 四:同步与异步 1、什么是单道?什么是多道技术? 单道和多道其实都是一种cpu运行程序的方式 -单道:指的是cpu从头到尾将一个程序执行完后,才能执行另外一个程序 -多道:当一个程序执行时遇到阻塞,cpu空闲下来时,cpu会被调度到其它

内容概括:

  一:单道与多道技术

  二:进程与程序

  三:并发与并行

  四:同步与异步

 

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('任务没执行完,这段代码就执行了')

 

今天的文章多进程_多进程处理是什么意思分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/53977.html

(0)
编程小号编程小号
上一篇 2023-08-29
下一篇 2023-08-29

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注