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实现类继承实例
Jul 04 Python
用实例解释Python中的继承和多态的概念
Apr 27 Python
python的pdb调试命令的命令整理及实例
Jul 12 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
Apr 11 Python
解决pandas展示数据输出时列名不能对齐的问题
Nov 18 Python
Python 写了个新型冠状病毒疫情传播模拟程序
Feb 14 Python
Python3 mmap内存映射文件示例解析
Mar 23 Python
python Canny边缘检测算法的实现
Apr 24 Python
python脚本定时发送邮件
Dec 22 Python
用Python编写简单的gRPC服务的详细过程
Jul 04 Python
Python torch.flatten()函数案例详解
Aug 30 Python
Django框架中模型的用法
Jun 10 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冒泡排序
2014/12/30 PHP
php结合curl实现多线程抓取
2015/07/09 PHP
ThinkPHP实现简单登陆功能
2017/04/28 PHP
in.js 一个轻量级的JavaScript颗粒化模块加载和依赖关系管理解决方案
2011/07/26 Javascript
Javascript变量函数浅析
2011/09/02 Javascript
JS实现QQ图片一闪一闪的效果小例子
2013/07/31 Javascript
javascript实现3D变换的立体圆圈实例
2015/08/06 Javascript
原生js实现数字字母混合验证码的简单实例
2015/12/10 Javascript
jQuery判断浏览器并动态调整select宽度的方法
2016/03/02 Javascript
详解如何较好的使用js
2016/12/16 Javascript
JS打开摄像头并截图上传示例
2017/02/18 Javascript
BootStrap fileinput.js文件上传组件实例代码
2017/02/20 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
vue 修改 data 数据问题并实时显示的方法
2018/08/27 Javascript
微信小程序如何调用新闻接口实现列表循环
2019/07/02 Javascript
vue-cli随机生成port源码的方法
2019/09/02 Javascript
python字符串的方法与操作大全
2018/01/30 Python
pandas apply 函数 实现多进程的示例讲解
2018/04/20 Python
python 对txt中每行内容进行批量替换的方法
2018/07/11 Python
Python设计模式之模板方法模式实例详解
2019/01/17 Python
python环境路径配置以及命令行运行脚本
2019/04/02 Python
详解python执行shell脚本创建用户及相关操作
2019/04/11 Python
python将字母转化为数字实例方法
2019/10/04 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
2020/09/16 Python
python boto和boto3操作bucket的示例
2020/10/30 Python
CSS3 3D制作实战案例分析
2016/09/18 HTML / CSS
button在IE6/7下的黑边去除方案
2012/12/24 HTML / CSS
用HTML5制作数字时钟的教程
2015/05/11 HTML / CSS
阿拉伯时尚购物网站:Nisnass
2021/02/07 全球购物
瑞典多品牌连锁店:Johnells
2021/01/13 全球购物
师范毕业生求职自荐信
2013/09/25 职场文书
数控专业个人求职信范文
2014/02/05 职场文书
军训自我鉴定怎么写
2014/02/13 职场文书
“5.12”护士节主持词
2015/07/04 职场文书
个人工作总结怎么写?
2019/04/09 职场文书
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫