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改变日志(logging)存放位置的示例
Mar 27 Python
Python手机号码归属地查询代码
May 04 Python
Python内置函数 next的具体使用方法
Nov 24 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
Feb 24 Python
使用pycharm在本地开发并实时同步到服务器
Aug 02 Python
python安装gdal的两种方法
Oct 29 Python
Python urlencode和unquote函数使用实例解析
Mar 31 Python
Keras官方中文文档:性能评估Metrices详解
Jun 15 Python
Python 3.9的到来到底是意味着什么
Oct 14 Python
python 爬虫网页登陆的简单实现
Nov 30 Python
Python 利用argparse模块实现脚本命令行参数解析
Dec 28 Python
Python Selenium库的基本使用教程
Jan 04 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
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
2010/05/04 PHP
PHP获取当前页面完整URL的实现代码
2013/06/10 PHP
PHP的cURL库简介及使用示例
2015/02/06 PHP
PHP 文件锁与进程锁的使用示例
2017/08/07 PHP
Jquery 动态添加按钮实现代码
2010/05/06 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
jQuery使用中可能被XSS攻击的一些危险环节提醒
2016/05/24 Javascript
JavaScript自定义分页样式
2017/01/17 Javascript
Bootstrap3 模态框使用实例
2017/02/22 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
2017/04/22 Javascript
详解nodejs实现本地上传图片并预览功能(express4.0+)
2017/06/28 NodeJs
vue mint-ui 实现省市区街道4级联动示例(仿淘宝京东收货地址4级联动)
2017/10/16 Javascript
解决Jstree 选中父节点时被禁用的子节点也会选中的问题
2017/12/27 Javascript
9102了,你还不会移动端真机调试吗
2019/03/25 Javascript
webpack.DefinePlugin与cross-env区别详解
2020/02/23 Javascript
原生JavaScript之es6中Class的用法分析
2020/02/23 Javascript
python实现实时监控文件的方法
2016/08/26 Python
基于ID3决策树算法的实现(Python版)
2017/05/31 Python
Python 多进程并发操作中进程池Pool的实例
2017/11/01 Python
Python实现的求解最小公倍数算法示例
2018/05/03 Python
python实现微信自动回复机器人功能
2019/07/11 Python
python groupby 函数 as_index详解
2019/12/16 Python
Python基础之函数原理与应用实例详解
2020/01/03 Python
通过实例简单了解Python sys.argv[]使用方法
2020/08/04 Python
python不同版本的_new_不同点总结
2020/12/09 Python
用canvas画心电图的示例代码
2018/09/10 HTML / CSS
草莓网美国官网:Strawberrynet USA
2016/12/11 全球购物
美国在线工具商店:Acme Tools
2018/06/26 全球购物
怎样自定义一个异常类
2016/09/27 面试题
求职简历的自我评价怎样写好
2013/10/07 职场文书
房屋买卖委托公证书
2014/04/08 职场文书
学校安全生产承诺书
2014/05/23 职场文书
《生物入侵者》教学反思
2016/02/16 职场文书
读《人生的智慧》有感:闲暇是人生的精华
2019/12/25 职场文书
能让Python提速超40倍的神器Cython详解
2021/06/24 Python