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的Flask框架中实现分页功能的教程
Apr 20 Python
python thrift搭建服务端和客户端测试程序
Jan 17 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
Apr 20 Python
Python中is和==的区别详解
Nov 15 Python
想学python 这5本书籍你必看!
Dec 11 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
Apr 29 Python
python 搜索大文件的实例代码
Jul 08 Python
Django实现跨域的2种方法
Jul 31 Python
python sorted方法和列表使用解析
Nov 18 Python
python将数组n等分的实例
Dec 02 Python
基于python traceback实现异常的获取与处理
Dec 13 Python
python中函数返回多个结果的实例方法
Dec 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
twig模板获取全局变量的方法
2016/02/05 PHP
PHP7常量数组用法分析
2016/09/26 PHP
PHP 微信扫码支付源代码(推荐)
2016/11/03 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
2019/09/02 PHP
JavaScript 对话框和状态栏使用说明
2009/10/25 Javascript
javascript下判断一个对象是否具有指定名称的属性的的代码
2010/01/11 Javascript
JavaScript游戏之优化篇
2010/11/08 Javascript
HTML长文本截取含有HTML代码同样适用的两种方法
2013/07/31 Javascript
JS图片无缝、平滑滚动代码
2014/03/11 Javascript
使用Object.defineProperty实现简单的js双向绑定
2016/04/15 Javascript
jquery pagination插件动态分页实例(Bootstrap分页)
2016/12/23 Javascript
原生js封装自定义滚动条
2017/03/24 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
2017/04/07 jQuery
Angular.js前台传list数组由后台spring MVC接收数组示例代码
2017/07/31 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
使用express搭建一个简单的查询服务器的方法
2018/02/09 Javascript
layui实现显示数据表格、搜索和修改功能示例
2020/06/03 Javascript
基于Ionic3实现选项卡切换并重新加载echarts
2020/09/24 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
JS实现点击掉落特效
2021/01/29 Javascript
[06:35]2014DOTA2国际邀请赛 老男孩梦圆西雅图中国军团世界最强
2014/07/22 DOTA
Python多线程编程(七):使用Condition实现复杂同步
2015/04/05 Python
python搭建微信公众平台
2016/02/09 Python
Python面向对象编程中关于类和方法的学习笔记
2016/06/30 Python
python调用百度语音识别api
2018/08/30 Python
Python3 获取文件属性的方式(时间、大小等)
2020/03/12 Python
4行Python代码生成图像验证码(2种)
2020/04/07 Python
Python Serial串口基本操作(收发数据)
2020/11/06 Python
魅力惠奢品线上平台:MEI.COM
2016/11/29 全球购物
教师实习自我鉴定
2013/12/13 职场文书
大学三年计划书范文
2014/04/30 职场文书
中学生2014国庆节演讲稿:不屈的民族
2014/09/21 职场文书
群众路线自我剖析材料
2014/10/08 职场文书
2014年班组工作总结
2014/11/20 职场文书
SQL Server内存机制浅探
2022/04/06 SQL Server
关于vue-router-link选择样式设置
2022/04/30 Vue.js