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 pdb调试方法分享
Jan 21 Python
python爬虫入门教程之糗百图片爬虫代码分享
Sep 02 Python
Python模块搜索概念介绍及模块安装方法介绍
Jun 03 Python
Python使用PIL库实现验证码图片的方法
Mar 11 Python
python 实现上传图片并预览的3种方法(推荐)
Jul 14 Python
对python numpy数组中冒号的使用方法详解
Apr 17 Python
python得到电脑的开机时间方法
Oct 15 Python
对python字典过滤条件的实例详解
Jan 22 Python
python3利用ctypes传入一个字符串类型的列表方法
Feb 12 Python
Django urls.py重构及参数传递详解
Jul 23 Python
Pycharm+Python工程,引用子模块的实现
Mar 09 Python
pandas中pd.groupby()的用法详解
Jun 16 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 文件夹删除、php清除缓存程序
2009/08/25 PHP
深入PHP变量存储的详解
2013/06/13 PHP
laravel框架 api自定义全局异常处理方法
2019/10/11 PHP
Javascript+XMLHttpRequest+asp.net无刷新读取数据库数据
2009/08/09 Javascript
JavaScript入门之基本函数详解
2011/10/21 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
JS获取URL中的参数数据
2013/12/05 Javascript
Javascript中arguments和arguments.callee的区别浅析
2015/04/24 Javascript
JS对字符串编码的几种方式使用指南
2015/05/14 Javascript
JavaScript中this的9种应用场景及三种复合应用场景
2015/09/12 Javascript
javascript设计模式--策略模式之输入验证
2015/11/27 Javascript
JS中的三个循环小结
2017/06/20 Javascript
Angular CLI 安装和使用教程
2017/09/13 Javascript
微信小程序数字滚动插件使用详解
2018/02/02 Javascript
详解webpack编译速度提升之DllPlugin
2019/02/05 Javascript
微信小程序利用swiper+css实现购物车商品删除功能
2019/03/06 Javascript
vue组件数据传递、父子组件数据获取,slot,router路由功能示例
2019/03/19 Javascript
JS document form表单元素操作完整示例
2020/01/13 Javascript
原生js无缝轮播插件使用详解
2020/03/09 Javascript
python实现图片批量剪切示例
2014/03/25 Python
利用Django模版生成树状结构实例代码
2019/05/19 Python
python 并发编程 多路复用IO模型详解
2019/08/20 Python
flask框架配置mysql数据库操作详解
2019/11/29 Python
Python 多线程共享变量的实现示例
2020/04/17 Python
解决numpy矩阵相减出现的负值自动转正值的问题
2020/06/03 Python
Python 在函数上添加包装器
2020/07/28 Python
HTML中meta标签及Keywords
2020/04/15 HTML / CSS
Perfume’s Club美国官网:西班牙第一家在线美容店
2020/06/10 全球购物
如何获得EntityManager
2014/02/09 面试题
优秀毕业大学生推荐信
2013/11/13 职场文书
工程招投标邀请书
2014/01/30 职场文书
现场施工员岗位职责
2014/03/10 职场文书
派出所正风肃纪剖析材料
2014/10/10 职场文书
万能检讨书开头与结尾怎么写
2015/02/17 职场文书
简单的辞职信怎么写
2015/02/28 职场文书
CSS使用SVG实现动态分布的圆环发散路径动画
2022/12/24 HTML / CSS