Python多进程原理与用法分析


Posted in Python onAugust 21, 2018

本文实例讲述了Python多进程原理与用法。分享给大家供大家参考,具体如下:

进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然,程序是死的(静态的),进程是活的(动态的)。进程可以分为系统进程和用户进程。凡是用于完成操作系统的各种功能的进程就是系统进程,它们就是处于运行状态下的操作系统本身;所有由你启动的进程都是用户进程。进程是操作系统进行资源分配的单位。

开启一个进程

import multiprocessing,time,os
def runtask():
  time.sleep(2)
  print("开启一个进程:%s"%os.getpid())
if __name__ == "__main__":
  p = multiprocessing.Process(target=runtask,)
  p.start()

进程队列

import multiprocessing
def runtask():
  q.put([42,"python"])
if __name__ == "__main__":
  q = multiprocessing.Queue()
  p = multiprocessing.Process(target=runtask,)
  p.start()
  print(q.get())   # 打印结果:[42,"python"]

pipe管道

返回两个连接对象。代表管道的两端,默认双向通信。

import multiprocessing
def runtask():
  conn.send("abc")
  conn.close()
if __name__ == "__main__":
  conn,pconn = multiprocessing.Pipe()
  p = multiprocessing.Process()
  p.start()
  print(pconn.recv())   # 打印结果:"abc"

Value、Array

共享内存有两个结构,一个是Value,一个是Array,这两个结构内部都实现了锁机制,因此进程是安全的。

import multiprocess
def runtask():
  d.value = 50
  for index in range(len(a)):
    a[index]+=10
if __name__ == "__main__":
  # 下面的字符"d"、"i"似乎是固定的,换成其他将会报错。求大神解释
  d = Value("d",20)
  a = Array("i",range(10))
  p = multiprocessing.Process(target=runtask,)
  p.start()
  p.join()  # 等待进程执行完毕
  print(d.value,a[:])   # 打印结果: 50.0 [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

Manager

Python实现多进程之间通信除了Queue(队列)、Pipe(管道)和Value-Array之外,还提供了更高层次的封装。Manager支持的类型非常多,如:list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Queue, Value 和 Array 用法如下:

import multiprocessing
def runtask():
  d["name"] = "laowang"
  l.reverse()
if __name__ == "__main__":
  with multiprocessing.Manager() as manager:
    d = manager.dict()
    l = manager.list(range(10))
    p = multiprocessing.Process(target=runtask,)
    p.start()
    p.join()    # 等待进程执行完毕
    print(d,l)   # 打印结果:{'name': 'laowang'} [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

进程池Pool

Pool 是进程池,进程池能够管理一定的进程,当有空闲进程时,则利用空闲进程完成任务,直到所有任务完成为止

import multiprocessing
def runtask():
  pass
def callBackTask(arg):     # 回调函数必须要有一个形参,否则将报错
  print("执行回调函数",arg)
if __name__ == "__main__":
  pool = multiprocessing.Pool(5)   # 设置进程池最大同时执行进程数
  for index in range(20):
    pool.apply_async(func=runtask,callback=callBackTask)  # 并行的,有回调方法
    # pool.apply(func=runtask,)    # 串行的,无回调函数
  pool.close()  # 关闭进程池
  pool.join()   # #调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束

执行结果:apply方法效果为一个进行接一个进程的执行,而apply_async是同时有5个进程在执行。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python通过exifread模块获得图片exif信息的方法
Mar 16 Python
python使用urllib2提交http post请求的方法
May 26 Python
Win7下搭建python开发环境图文教程(安装Python、pip、解释器)
May 17 Python
Python中查看文件名和文件路径
Mar 31 Python
Python基于回溯法子集树模板解决m着色问题示例
Sep 07 Python
pandas Dataframe行列读取的实例
Jun 08 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
Aug 31 Python
详解Django将秒转换为xx天xx时xx分
Sep 27 Python
python 安装impala包步骤
Mar 28 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
Jun 18 Python
Ubuntu 20.04安装Pycharm2020.2及锁定到任务栏的问题(小白级操作)
Oct 29 Python
Python中OpenCV实现简单车牌字符切割
Jun 11 Python
python安装twisted的问题解析
Aug 21 #Python
使用python的pandas库读取csv文件保存至mysql数据库
Aug 20 #Python
Python多线程原理与用法详解
Aug 20 #Python
Python模拟简单电梯调度算法示例
Aug 20 #Python
django_orm查询性能优化方法
Aug 20 #Python
Python Requests库基本用法示例
Aug 20 #Python
Django中使用第三方登录的示例代码
Aug 20 #Python
You might like
PHP调用MySQL的存储过程的实现代码
2008/08/12 PHP
PHP Echo字符串的连接格式
2016/03/07 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
实例化php类时传参的方法分析
2020/06/05 PHP
css样式标签和js语法属性区别
2013/11/06 Javascript
Javascript中匿名函数的多种调用方式总结
2013/12/06 Javascript
jQuery Ajax使用实例
2015/04/16 Javascript
javascript判断数组内是否重复的方法
2015/04/21 Javascript
BootStrap 动态表单效果
2017/06/02 Javascript
react-native-fs实现文件下载、文本存储的示例代码
2017/09/22 Javascript
vue.js如何将echarts封装为组件一键使用详解
2017/10/10 Javascript
移动前端图片压缩上传的实例
2017/12/06 Javascript
js动态添加表格逐行添加、删除、遍历取值的实例代码
2018/01/25 Javascript
JS学习笔记之数组去重实现方法小结
2019/05/29 Javascript
layui实现根据table数据判断按钮显示情况的方法
2019/09/26 Javascript
jquery ajax 请求小技巧实例分析
2019/11/11 jQuery
node使用request请求的方法
2019/12/20 Javascript
vue实现拖拽效果
2019/12/23 Javascript
vue 手机物理监听键+退出提示代码
2020/09/09 Javascript
基于react项目打包css引用路径错误解决方案
2020/10/28 Javascript
在antd Form表单中select设置初始值操作
2020/11/02 Javascript
python函数缺省值与引用学习笔记分享
2013/02/10 Python
python列表操作使用示例分享
2014/02/21 Python
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
2015/04/25 Python
使用Mixin设计模式进行Python编程的方法讲解
2016/06/21 Python
书单|人生苦短,你还不用python!
2017/12/29 Python
TensorFlow实现iris数据集线性回归
2018/09/07 Python
python实现ip地址的包含关系判断
2020/02/07 Python
解决python3插入mysql时内容带有引号的问题
2020/03/02 Python
html5触摸事件判断滑动方向的实现
2018/06/05 HTML / CSS
世界上最大的皮肤科医生拥有和经营的美容网站:LovelySkin
2021/01/03 全球购物
体育节口号
2014/06/19 职场文书
舞蹈教育学专业求职信
2014/06/29 职场文书
高三语文教学反思
2016/02/16 职场文书
2019新员工心得体会
2019/06/25 职场文书
JavaScript实现外溢动态爱心的效果的示例代码
2022/03/21 Javascript