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中使用动态变量名的方法
May 06 Python
从零学python系列之新版本导入httplib模块报ImportError解决方案
May 23 Python
分析用Python脚本关闭文件操作的机制
Jun 28 Python
Python3.遍历某文件夹提取特定文件名的实例
Apr 26 Python
Python中py文件引用另一个py文件变量的方法
Apr 29 Python
解决Ubuntu pip 安装 mysql-python包出错的问题
Jun 11 Python
Tensorflow中的placeholder和feed_dict的使用
Jul 09 Python
python opencv实现信用卡的数字识别
Jan 12 Python
windows支持哪个版本的python
Jul 03 Python
如何利用Python动态模拟太阳系运转
Sep 04 Python
PyQt5多线程防卡死和多窗口用法的实现
Sep 15 Python
python自动化办公操作PPT的实现
Feb 05 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
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
2013/04/22 PHP
php无限遍历文件夹示例分享
2014/03/04 PHP
php微信公众号开发之校园图书馆
2018/10/20 PHP
TP5.0框架实现无限极回复功能的方法分析
2019/05/04 PHP
JavaScript中的prototype使用说明
2010/04/13 Javascript
Javascript之旅 对象的原型链之由来
2010/08/25 Javascript
关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
2012/03/01 Javascript
分享精心挑选的12款优秀jQuery Ajax分页插件和教程
2012/08/09 Javascript
jquery获取焦点和失去焦点事件代码
2013/04/21 Javascript
浅析js中2个等号与3个等号的区别
2013/08/06 Javascript
javascript获取选中的文本的方法代码
2013/10/30 Javascript
浅析2种JavaScript继承方式
2015/12/04 Javascript
快速掌握Node.js中setTimeout和setInterval的使用方法
2016/03/21 Javascript
针对JavaScript中this指向的简单理解
2016/08/26 Javascript
用iframe实现不刷新整个页面上传图片的实例
2016/11/18 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
js制作简单的音乐播放器的示例代码
2017/08/28 Javascript
深入浅析Vue.js中 computed和methods不同机制
2018/03/22 Javascript
js中的闭包实例展示
2018/11/01 Javascript
用图片替换checkbox原始样式并实现同样的功能
2018/11/15 Javascript
小程序实现录音功能
2020/09/22 Javascript
[00:57]英雄,你的补给到了!
2020/11/13 DOTA
Python下singleton模式的实现方法
2014/07/16 Python
python如何实现内容写在图片上
2018/03/23 Python
Python解决两个整数相除只得到整数部分的实例
2018/11/10 Python
python绘制BA无标度网络示例代码
2019/11/21 Python
pytorch masked_fill报错的解决
2020/02/18 Python
Django前后端分离csrf token获取方式
2020/12/25 Python
证婚人经典证婚词
2014/01/09 职场文书
房地产推广策划方案
2014/05/19 职场文书
学校交通安全责任书
2014/08/25 职场文书
2015年后备干部工作总结
2015/05/15 职场文书
用电申请报告范文
2015/05/18 职场文书
中国梦党课学习心得体会
2016/01/05 职场文书
年终工作总结范文
2019/06/20 职场文书
发言稿之优秀教师篇
2019/09/26 职场文书