多进程是什么

多进程指的是操作系统同时支持多个处理器的能力。在支持多任务操作系统中,一个应用程序会被分解成多个独立运行的较小的程序。操作系统会将这些线程分配到多核处理器,以提升系统性能。

为什么需要多进程

假设我们的计算机只有一个单核的处理器,然后同时被分配了几个任务,那么它就不得不在各个任务中来回切换,短暂地执行其中一个任务,然后中断,然后短暂地执行下一个任务,以保持所有的进程都在运行。这就像一个厨师在做面条,切几秒钟菜,跑去揉几下面,再赶紧查看下汤。所以同时需要完成的任务越多,同时跟踪所有的任务就越困难。这就是多进程的必要性,也是多核处理器的威力所在。一个支持多进程的操作系统可以做到:

  • 同时指挥多个CPU,即拥有一个以上的CPU的计算机
  • 指挥多核CPU,即拥有两个及以上的独立处理单元的CPU

这样,计算机就可以轻松地同时执行多个任务,每个任务都可以使用自己的处理器。就像之前举的例子,现在厨房里有专门的揉面师傅,备菜师傅,煮汤师傅。事情就变得轻松多了。

用Python执行多进程

学习Python的优势之一就是它拥有海量的第三方模块。今天我们再来介绍一个能帮你轻松完成多进程并行的模块:multiprocessingmultiprocessing模块支持使用类似于threading模块的API生成进程。multiprocessing模块提供了本地和远程计算机的并行处理能力,并且通过使用创建子进程,有效地避开了全局解释器锁(GIL)。因此,multiprocessing模块允许程序员充分利用机器上的多个处理器。目前,它可以在Unix和Windows上运行。multiprocessing的模块的API非常简单直观,可以让新手迅速上手在多个进程之间划分工作。我们现在看一个简单的例子:

# importing the multiprocessing module import multiprocessing def print_cube(num):     print("Cube: {}".format(num * num * num)) def print_square(num):     print("Square: {}".format(num * num)) if __name__ == "__main__": # creating processes     p1 = multiprocessing.Process(target=print_square, args=(10, ))     p2 = multiprocessing.Process(target=print_cube, args=(10, )) # starting process 1&2    p1.start()     p2.start() # wait until process 1&2 is finished     p1.join()     p2.join() # both processes finished     print("Done!") 

运行结果是这样的:

Square: 100Cube: 1000Done!

其实代码的含义非常简单了,首先我们导入了multiprocessing模块,随后定义了两个函数,它们的功能分别是打印一个数的三次方和打印一个数的平方。之后关键的步骤来了,要创建多个进程,首先需要创建Process类的对象。在这个例子中Process类接收了两个参数:

  • target:在进程中被执行的函数
  • args:向被执行函数传递的参数

当然,进程构造函数还可以接受许多其他参数,我们之后会更详细地介绍。在上面的例子中,我们创建了两个具有不同目标函数的进程:

p1 = multiprocessing.Process(target=print_square, args=(10, ))p2 = multiprocessing.Process(target=print_cube, args=(10, )) 

随后的start()方法就是开始执行p1,p2两个进程。在进程开始执行后,主程序仍然会继续执行。为了让主程序暂停,我们就使用了join()方法。它的作用就是将主程序暂停,直到等待p1和p2完成。一旦它们都完成了,再执行之后的语句。让我们再举一个例子,来理解同一个脚本中运行不同进程的概念。在下面的例子中,我们打印运行目标函数的进程ID:

# importing the multiprocessing module import multiprocessing import os def worker1(): # printing process id     print("ID of process running worker1: {}".format(os.getpid())) def worker2(): # printing process id     print("ID of process running worker2: {}".format(os.getpid())) if __name__ == "__main__": # printing main program process id     print("ID of main process: {}".format(os.getpid())) # creating processes     p1 = multiprocessing.Process(target=worker1)     p2 = multiprocessing.Process(target=worker2) # starting processes     p1.start()     p2.start() # process IDs     print("ID of process p1: {}".format(p1.pid))     print("ID of process p2: {}".format(p2.pid)) # wait until processes are finished     p1.join()     p2.join() # both processes finished     print("Both processes finished execution!") # check if processes are alive     print("Process p1 is alive: {}".format(p1.is_alive()))     print("Process p2 is alive: {}".format(p2.is_alive())) 

上面这个程序的输出结果如下:

ID of main process: 28628ID of process running worker1: 29305ID of process running worker2: 29306ID of process p1: 29305ID of process p2: 29306Both processes finished execution!Process p1 is alive: FalseProcess p2 is alive: False

主python脚本有一个独立的进程ID,当我们创建进程对象p1和p2时,multiprocessing模块会生成具有不同进程ID的新进程。os.getpid()函数是用来获取运行当前目标函数的进程的ID。上述输出结果也可以看到,使用os.getpid()获取的进程ID与通过进程类的pid属性获得的ID是一致的。上面的每个进程都是独立运行的,并且拥有自己独立的内存空间。一旦目标函数执行完成,进程就会终止。在上面的程序中,我们使用了Process类的is_alive()方法来检查进程是否仍然处于活动状态。最后用下面的图来帮助理解记忆新进程与主Python脚本的不同之处:图1.进程ID示意图这篇文章是对Python中的多进程的一个初步介绍。接下来的几篇文章将进一步介绍多进程相关知识。敬请期待吧!

multiprocessing python_Python多进程运行——Multiprocessing基础教程1相关推荐

  1. python php multiprocessing,Python多进程并发(multiprocessing)用法实例详解

    本文实例讲述了Python多进程并发(multiprocessing)用法.分享给大家供大家参考.具体分析如下: 由于Python设计的限制(我说的是咱们常用的CPython).最多只能用满1个CPU ...

  2. Python使用multiprocessing实现多进程

    Python使用multiprocessing实现多进程 进程是操作系统进行资源分配和调度的一个基本单位. 一.进程及多任务介绍 程序:程序是一个静态的概念.在一台电脑上,我们安装了很多程序,这些程序 ...

  3. multiprocessing python_Python多线程/进程(threading、multiprocessing)知识覆盖详解

    你好,我是goldsunC 让我们一起进步吧! 基本知识 在Python中有一个全局解释器锁GIL(Global Interpreter Lock).GIL源于Python设计之初的考虑,目的是使数据 ...

  4. python queue 多进程_python中的Queue与多进程(multiprocessing)

    最近接触一个项目,要在多个虚拟机中运行任务,参考别人之前项目的代码,采用了多进程来处理,于是上网查了查python中的多进程 一.先说说Queue(队列对象) Queue是python中的标准库,可以 ...

  5. 【python第三方库】python多进程编程multiprocessing库和subprocess库的区别与使用

    多进程,多线程介绍请阅读blog python多线程编程请阅读blog 文章目录 一.mutiprocessing库与subprocess库的区别 二.multiprocessing使用介绍 1. 创 ...

  6. 多进程(Multiprocessing)

    多进程(Multiprocessing) 源自莫烦python多进程教学 一.多进程的定义和优点 多进程相当于多核处理,它能弥补threading的缺点 即它可以把任务平均分配给每一个核,并且让它们同 ...

  7. Xamarin.FormsShell基础教程(4)Shell项目内容列表页面运行效果

    Xamarin.FormsShell基础教程(4)Shell项目内容列表页面运行效果 在创建好Shell解决方案后,就可以运行程序了.本小节将讲解运行后的效果. 内容列表页面 运行程序,初始效果如图1 ...

  8. 转元组 python_Python基础教程,第三讲,列表和元组

    学完此次课程,我能做什么? 学完本次课程后,大家会对python中序列有所了解,知道列表和元组的区别以及使用场景是什么? 学习此次课程,需要多久? 15-20分钟 课程内容 列表和元组的区别是什么? ...

  9. python基础教程运行程序_Python入门基础教程:WSGI

    原标题:Python入门基础教程:WSGI WSGI 简介 WSGI 是什么 WSGI 是 Python Web Server Gateway Interface 的缩写,是描述 Web 服务器与 P ...

最新文章

  1. Swift学习总结【持续更新】
  2. UI设计培训分享:ui的字体怎么正确设置?
  3. 实验问题总结与分享之×××(Virtual Private Network)
  4. ゾーン10進数、パック10進数
  5. zabbix内存告警linux,配置zabbix当内存剩余不足10%的时候触发报警
  6. android 滑动过程 触发,android 代码实现模拟用户点击、滑动等操作
  7. python发布服务,Python服务发现:在本地n上发布服务
  8. Linux版本的ActiveMQ安装过程
  9. 20211130:力扣第267周周赛(下)
  10. vb6与access数据库交互常见问题——未完待续
  11. 连接linux服务器工具
  12. myeclipse取消快捷键
  13. JavaScript学习记录十六
  14. 如何让计算机显示隐藏的文件夹,隐藏的文件夹如何显示 win7与xp系统显示隐藏文件夹的设置方法...
  15. python3-张子枫图片爬取
  16. CABasicAnimation,CAKeyframeAnimation,CATransition,CAAnimationGroup,UIBezierPath之间做动画的不同点和各自的使用范围。
  17. 大漠多线程循环任务自动切换模板判断账号登陆成功
  18. 小试牛刀—猜数字游戏
  19. 如何引爆手淘首页流量,手淘首页流量获取玩法
  20. python 打开浏览器的三种方式

热门文章

  1. mysql外键约束查询语句_MySQL数据库 : 查询语句,连接查询及外键约束
  2. 130 道 Kubernetes + Docker + DevOps 大厂面试题及知识点详解
  3. Github 移动端上架!把世界最大同性交友社区装进口袋
  4. 哪个瞬间你对科研圈彻底失望了?
  5. 机器学习中如何处理不平衡数据?
  6. python目录遍历_python文件操作之目录遍历实例分析
  7. dell驱动安装工具_技术丨如何快速安装显卡驱动
  8. 全国计算机一级考试理论,全国计算机等级考试一级理论汇总(最新版).pptx
  9. php程序yii是什么意思,Yii框架啥意思
  10. pdm生成mysql sql语句_如何用Powerdesigner的PDM生成数据库