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中的随机函数random的用法示例
Jan 27 Python
python读取文本中的坐标方法
Oct 14 Python
pycharm重置设置,恢复默认设置的方法
Oct 22 Python
基于python操作ES实例详解
Nov 16 Python
tensorflow实现对张量数据的切片操作方式
Jan 19 Python
Python换行与不换行的输出实例
Feb 19 Python
python print 格式化输出,动态指定长度的实现
Apr 12 Python
解决pycharm安装第三方库失败的问题
May 09 Python
解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题
Jul 02 Python
在Python中字典按值排序的实现方法
Nov 12 Python
python函数超时自动退出的实操方法
Dec 28 Python
Python中itertools库的四个函数介绍
Apr 06 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
解析centos中Apache、php、mysql 默认安装路径
2013/06/25 PHP
PHP实现把数字ID转字母ID
2013/08/12 PHP
推荐5款跨平台的PHP编辑器
2014/12/25 PHP
yii2中添加验证码的实现方法
2016/01/09 PHP
AES加解密在php接口请求过程中的应用示例
2016/10/26 PHP
php简单生成一组与多组随机字符串的方法
2017/05/09 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
2018/10/14 PHP
Laravel5.7 数据库操作迁移的实现方法
2019/04/12 PHP
javascript动态加载二
2012/08/22 Javascript
JavaScript实现网页上的浮动广告的简单方法
2013/06/14 Javascript
Javascript中浮点数相乘的一个解决方法
2014/06/03 Javascript
JavaScript中的document.referrer在各种浏览器测试结果
2014/07/18 Javascript
JS基于Ajax实现的网页Loading效果代码
2015/10/27 Javascript
jquery拖动层效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
JS简单实现禁止访问某个页面的方法
2016/09/13 Javascript
Bootstrap基本插件学习笔记之轮播幻灯片(23)
2016/12/08 Javascript
微信小程序 五星评价功能的实现
2017/03/09 Javascript
Node.js爬取豆瓣数据实例分析
2018/03/05 Javascript
javaScript中"=="和"==="的区别详解
2018/03/16 Javascript
javascript匿名函数中的'return function()'作用
2018/10/15 Javascript
使用python加密自己的密码
2015/08/04 Python
python调用系统ffmpeg实现视频截图、http发送
2018/03/06 Python
python实现多层感知器
2019/01/18 Python
用python3读取python2的pickle数据方式
2019/12/25 Python
pytorch+lstm实现的pos示例
2020/01/14 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
就业推荐表自我鉴定
2013/10/29 职场文书
优秀毕业生求职推荐信范文
2013/11/21 职场文书
联欢晚会主持词
2014/03/25 职场文书
安全生产演讲稿
2014/05/09 职场文书
大学生入党推荐书范文
2014/05/17 职场文书
2014乡镇党政班子四风问题思想汇报
2014/09/14 职场文书
收银员岗位职责范本
2015/04/07 职场文书
检察院起诉书
2015/05/20 职场文书