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  连接字符串(join %)
Sep 06 Python
Python制作简易注册登录系统
Dec 15 Python
TensorFlow神经网络优化策略学习
Mar 09 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
May 25 Python
python简易远程控制单线程版
Jun 20 Python
python中使用 xlwt 操作excel的常见方法与问题
Jan 13 Python
在Python中使用MongoEngine操作数据库教程实例
Dec 03 Python
django框架cookie和session用法实例详解
Dec 10 Python
tensorflow 实现自定义layer并添加到计算图中
Feb 04 Python
python 获取谷歌浏览器保存的密码
Jan 06 Python
Python自然语言处理之切分算法详解
Apr 25 Python
关于Python中*args和**kwargs的深入理解
Aug 07 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+mysql查询优化简单实例
2015/01/13 PHP
Laravel源码解析之路由的使用和示例详解
2018/09/27 PHP
php与阿里云短信接口接入操作案例分析
2020/05/27 PHP
理解Javascript_14_函数形式参数与arguments
2010/10/20 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
JavaScript通过function定义对象并给对象添加toString()方法实例分析
2015/03/23 Javascript
jQuery结合ajax实现动态加载文本内容
2015/05/19 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
2015/12/29 Javascript
基于jQuery插件实现点击小图显示大图效果
2016/05/11 Javascript
文件上传插件SWFUpload的使用指南
2016/11/29 Javascript
json数据处理及数据绑定
2017/01/25 Javascript
javascript实现滑动解锁功能
2017/03/22 Javascript
vue组件实现文字居中对齐的方法
2017/08/23 Javascript
vue-router配合ElementUI实现导航的实例
2018/02/11 Javascript
JS中常用的消息框总结
2018/02/24 Javascript
js实现左右两侧浮动广告
2018/07/09 Javascript
JS栈stack类的实现与使用方法示例
2019/01/31 Javascript
JavaScript封闭函数及常用内置对象示例
2019/05/13 Javascript
少女风vue组件库的制作全过程
2019/05/15 Javascript
vue中nextTick用法实例
2019/09/11 Javascript
JS获取当前时间戳方法解析
2020/08/29 Javascript
Openlayers实现点闪烁扩散效果
2020/09/24 Javascript
使用PYTHON创建XML文档
2012/03/01 Python
Python实现周期性抓取网页内容的方法
2015/11/04 Python
一道python走迷宫算法题
2018/01/22 Python
python TKinter获取文本框内容的方法
2018/10/11 Python
Pycharm最常用的快捷键及使用技巧
2020/03/05 Python
对python中arange()和linspace()的区别说明
2020/05/03 Python
python从Oracle读取数据生成图表
2020/10/14 Python
HTML5资源预加载(Link prefetch)详细介绍(给你的网页加速)
2014/05/07 HTML / CSS
详解HTML5中rel属性的prefetch预加载功能使用
2016/05/06 HTML / CSS
英国100%防污和防水的靴子:Muck Boot Company
2020/09/08 全球购物
法国低价在线宠物商店:bitiba.fr
2020/07/03 全球购物
服务中心夜班服务员岗位职责
2013/11/27 职场文书
少先队学雷锋活动月总结
2014/03/09 职场文书
MySQL添加索引特点及优化问题
2022/07/23 MySQL