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构造icmp echo请求和实现网络探测器功能代码分享
Jan 10 Python
pycharm 使用心得(二)设置字体大小
Jun 05 Python
python实现从web抓取文档的方法
Sep 26 Python
在Python中使用gRPC的方法示例
Aug 08 Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
Jun 17 Python
python命名空间(namespace)简单介绍
Aug 10 Python
pytorch实现对输入超过三通道的数据进行训练
Jan 15 Python
python 爬取马蜂窝景点翻页文字评论的实现
Jan 20 Python
AUC计算方法与Python实现代码
Feb 28 Python
Pycharm如何自动生成头文件注释
Nov 14 Python
python Zmail模块简介与使用示例
Dec 19 Python
Python基础之元组与文件知识总结
May 19 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
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
2012/10/31 PHP
php 批量生成html,txt文件的实现代码
2013/06/26 PHP
JQuery 表单中textarea字数限制实现代码
2009/12/07 Javascript
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
js模拟滚动条(横向竖向)
2013/02/22 Javascript
JavaScript 消息框效果【实现代码】
2016/04/27 Javascript
jQuery 自定义下拉框(DropDown)附源码下载
2016/07/22 Javascript
js鼠标移动时禁止选中文字
2017/02/19 Javascript
jquery.picsign图片标注组件实例详解
2018/02/02 jQuery
JavaScript中构造函数与原型链之间的关系详解
2019/02/25 Javascript
vue cli 3.0 搭建项目的图文教程
2019/05/17 Javascript
了解JavaScript中let语句
2019/05/30 Javascript
JavaScript 链表定义与使用方法示例
2020/04/28 Javascript
[59:59]EG vs IG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[01:09:01]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第一场 10.28
2020/10/28 DOTA
在Django的视图中使用form对象的方法
2015/07/18 Python
python如何实现远程控制电脑(结合微信)
2015/12/21 Python
tensorflow 打印内存中的变量方法
2018/07/30 Python
浅谈python3中input输入的使用
2019/08/02 Python
Python如何实现动态数组
2019/11/02 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
2019/12/10 Python
python numpy实现rolling滚动案例
2020/06/08 Python
Python使用xpath实现图片爬取
2020/09/16 Python
如果NULL定义成#define NULL((char *)0)难道不就可以向函数传入不加转换的NULL了吗
2012/02/15 面试题
几个常见的消息中间件(MOM)
2014/01/08 面试题
行政主管职责范本
2014/03/07 职场文书
关于读书的演讲稿600字
2014/08/27 职场文书
党员四风问题对照检查材料思想汇报
2014/09/16 职场文书
布达拉宫的导游词
2015/02/02 职场文书
学生逃课万能检讨书2000字
2015/02/17 职场文书
聘任证明怎么写
2015/03/02 职场文书
2015中学教学工作总结
2015/07/22 职场文书
离婚起诉书范文2016
2015/11/26 职场文书
《索溪峪的野》教学反思
2016/02/19 职场文书
Python pandas之求和运算和非空值个数统计
2021/08/07 Python
C3 线性化算法与 MRO之Python中的多继承
2021/10/05 Python