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实现ip查询示例
Mar 26 Python
Python实现图像几何变换
Jul 06 Python
基于Python的关键字监控及告警
Jul 06 Python
浅析Python中return和finally共同挖的坑
Aug 18 Python
VSCode下配置python调试运行环境的方法
Apr 06 Python
Django项目实战之用户头像上传与访问的示例
Apr 21 Python
python将字符串list写入excel和txt的实例
Jul 20 Python
python循环输出三角形图案的例子
Nov 22 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
Feb 26 Python
python实现画图工具
Aug 27 Python
python海龟绘图之画国旗实例代码
Nov 11 Python
Python中使用Lambda函数的5种用法
Apr 01 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
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
PHP连接MongoDB示例代码
2012/09/06 PHP
php生成随机数的三种方法
2014/09/10 PHP
php socket通信(tcp/udp)实例分析
2016/02/14 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
2016/09/30 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
PHP实现的堆排序算法详解
2017/08/17 PHP
详解PHP中的外观模式facade pattern
2018/02/05 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
2019/07/22 PHP
jquery实现动态操作select选中
2015/02/11 Javascript
jQuery弹出层插件popShow(改进版)用法示例
2017/01/23 Javascript
NodeJS仿WebApi路由示例
2017/02/28 NodeJs
Angular.js自动化测试之protractor详解
2017/07/07 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
2017/08/16 Javascript
限时抢购-倒计时的完整实例(分享)
2017/09/17 Javascript
JS中promise化微信小程序api
2018/04/12 Javascript
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
2018/11/01 NodeJs
小程序扫描普通链接二维码跳转小程序指定界面方法
2019/05/07 Javascript
微信小程序实现树莓派(raspberry pi)小车控制
2020/02/12 Javascript
[01:08:29]DOTA2-DPC中国联赛定级赛 RNG vs Aster BO3第一场 1月9日
2021/03/11 DOTA
python实现封装得到virustotal扫描结果
2014/10/05 Python
pymongo给mongodb创建索引的简单实现方法
2015/05/06 Python
python代码过长的换行方法
2018/07/19 Python
python变量赋值方法(可变与不可变)
2019/01/12 Python
Tensorflow分类器项目自定义数据读入的实现
2019/02/05 Python
Anaconda配置pytorch-gpu虚拟环境的图文教程
2020/04/16 Python
纯CSS实现预加载动画效果
2017/09/06 HTML / CSS
苹果中国官方网站:Apple中国
2016/07/22 全球购物
英国床垫在线:Mattress Online
2016/12/07 全球购物
英国家居用品和家居装饰品购物网站:Cox & Cox
2019/08/25 全球购物
Linux Interview Questions For software testers
2013/05/17 面试题
EJB的角色和三个对象
2015/12/31 面试题
政风行风评议工作总结
2014/10/21 职场文书
人工作失职检讨书
2015/05/05 职场文书
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫
Java版 简易五子棋小游戏
2022/05/04 Java/Android