python 进程的几种创建方式详解


Posted in Python onAugust 29, 2019

在新创建的子进程中,会把父进程的所有信息复制一份,它们之间的数据互不影响。

使用os.fork()创建

该方式只能用于Unix/Linux操作系统中,在windows不能用。

import os
# 注意,fork函数,只在Unix/Linux/Mac上运行,windows不可以
pid = os.fork()
# 子进程永远返回0,而父进程返回子进程的ID。
if pid == 0:
  print('子进程')
else:
  print('父进程')

使用Process类类创建

multiprocessing模块提供了一个Process类来代表一个进程对象,下面的例子演示了启动一个子进程并等待其结束:

from multiprocessing import Process
import time

def test(name, age):
  for i in range(5):
    print("--test--%s\t%d" % (name, age))
    time.sleep(1)
  print("子进程结束")
if __name__ == '__main__':
  p = Process(target=test, args=("aaa", 18))
  p.start()
  # 等待进程实例执⾏结束,或等待多少秒;
  p.join() # 等待的最长时间
  print("主进程结束")
"""
输出结果:
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
子进程结束
主进程结束
"""

join()方法表示主进程等待子进程执行完成后继续往下执行,如果把join()注释掉,则主进程开启子进程后不停顿继续往下执行,然后等待子进程完成程序结束。

把join()方法注释掉的结果:

"""
输出结果:
主进程结束
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
子进程结束
"""

使用Process子类创建

创建新的进程还能够使用类的方式,可以自定义一个类,继承Process类,每次实例化这个类的时候,就等同于实例化一个进程对象,请看下面的实例:

from multiprocessing import Process
import time
import os
class MyProcess(Process):
  def __init__(self):
    # 如果子类要重写__init__是必须要先调用父类的__init__否则会报错
    # Process.__init__(self)  
    super(MyProcess,self).__init__()
  # 重写Porcess的run()方法
  def run(self):
    print("子进程(%s)开始执行,父进程(%s)" % (os.getpid(), os.getppid()))
    for i in range(5):
      print("--1--")
      time.sleep(1)
if __name__ == '__main__':
  t_start = time.time()
  p = MyProcess()
  p.start()
  # p.join()
  print("main")
  for i in range(5):
    print("--main--")
    time.sleep(1)

使用进程池Pool创建

当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法。

初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来执行,请看下面的实例:

from multiprocessing import Pool
import os
import time


def worker(num):
  # for i in range(3):
  print("----pid=%d num=%d---" % (os.getpid(), num))
  time.sleep(1)

if __name__ == '__main__':
  # 定义一个进程池,最大进程数3
  pool = Pool(3)
  for i in range(10):
    print("---%d--" % i)
    # 使用非阻塞方式调用func(并行执行),一般用这个。
    # apply堵塞方式必须等待上一个进程退出才能执行下一个进程,用的不多。
    pool.apply_async(worker, (i,))
  # 关闭进程池
  pool.close()
  # 等待所有子进程结束,主进程一般用来等待
  pool.join() # 进程池后面无操作时必须有这句

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python通过matplotlib画双层饼图及环形图简单示例
Dec 15 Python
python在线编译器的简单原理及简单实现代码
Feb 02 Python
Django权限机制实现代码详解
Feb 05 Python
python梯度下降法的简单示例
Aug 31 Python
使用Python如何测试InnoDB与MyISAM的读写性能
Sep 18 Python
在Pycharm中项目解释器与环境变量的设置方法
Oct 29 Python
PyCharm 创建指定版本的 Django(超详图解教程)
Jun 18 Python
python 含子图的gif生成时内存溢出的方法
Jul 07 Python
python中删除某个元素的方法解析
Nov 05 Python
python-sys.stdout作为默认函数参数的实现
Feb 21 Python
python编写一个会算账的脚本的示例代码
Jun 02 Python
Python中的嵌套循环详情
Mar 23 Python
python 列表推导式使用详解
Aug 29 #Python
django 数据库连接模块解析及简单长连接改造方法
Aug 29 #Python
解决Django连接db遇到的问题
Aug 29 #Python
Python pandas实现excel工作表合并功能详解
Aug 29 #Python
python openCV获取人脸部分并存储功能
Aug 28 #Python
python lambda表达式在sort函数中的使用详解
Aug 28 #Python
python实现微信小程序用户登录、模板推送
Aug 28 #Python
You might like
php解析字符串里所有URL地址的方法
2015/04/03 PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
2020/01/23 PHP
Yii使用DbTarget实现日志功能的示例代码
2020/07/21 PHP
HTML Dom与Css控制方法
2010/10/25 Javascript
JS+CSS实现一个气泡提示框
2013/08/18 Javascript
js导入导出excel(实例代码)
2013/11/25 Javascript
node.js中的events.emitter.removeListener方法使用说明
2014/12/10 Javascript
JS实现的生成随机数的4个函数分享
2015/02/11 Javascript
jQuery实现文本框邮箱输入自动补全效果
2015/11/17 Javascript
Js的Array数组对象详解
2016/02/22 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
2017/02/18 Javascript
JS实现移动端实时监听输入框变化的实例代码
2017/04/12 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
2018/03/09 Javascript
JavaScript判断对象和数组的两种方法
2019/05/31 Javascript
Vue实现拖放排序功能的实例代码
2019/07/08 Javascript
Vue如何获取数据列表展示
2019/12/11 Javascript
python快速排序代码实例
2013/11/21 Python
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
2014/08/22 Python
更改Python命令行交互提示符的方法
2015/01/14 Python
Django中如何使用sass的方法步骤
2019/07/09 Python
FFrpc python客户端lib使用解析
2019/08/24 Python
python监控nginx端口和进程状态
2019/09/06 Python
python自动化实现登录获取图片验证码功能
2019/11/20 Python
pytorch 实现删除tensor中的指定行列
2020/01/13 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
2021/01/29 Python
10分钟理解CSS3 Grid布局
2018/12/20 HTML / CSS
CSS3只让背景图片旋转180度的实现示例
2021/03/09 HTML / CSS
html5 浏览器支持 如何让所有的浏览器都支持HTML5标签样式
2012/12/07 HTML / CSS
美津浓美国官网:Mizuno美国
2018/08/07 全球购物
印尼购物网站:iLOTTE
2019/10/16 全球购物
意大利在线眼镜精品店:Ottica Lipari
2019/11/11 全球购物
某公司C#程序员面试题笔试题
2014/05/26 面试题
电大自我鉴定
2013/10/27 职场文书
生物科学专业职业规划书范文
2014/02/11 职场文书
节能环保标语
2014/06/12 职场文书
2014年个人总结范文
2015/03/09 职场文书