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守护进程用法实例分析
Jun 04 Python
Python使用flask框架操作sqlite3的两种方式
Jan 31 Python
解决Tensorflow使用pip安装后没有model目录的问题
Jun 13 Python
Python绘图Matplotlib之坐标轴及刻度总结
Jun 28 Python
Python列表元素常见操作简单示例
Oct 25 Python
使用Django搭建一个基金模拟交易系统教程
Nov 18 Python
Python类中self参数用法详解
Feb 13 Python
python 最简单的实现适配器设计模式的示例
Jun 30 Python
python实现AHP算法的方法实例(层次分析法)
Sep 09 Python
使用sublime text3搭建Python编辑环境的实现
Jan 12 Python
python自动化之如何利用allure生成测试报告
May 02 Python
python实现对doc、txt、xls等文档的读写操作
Apr 02 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冒泡排序算法代码详细解读
2011/07/17 PHP
PHP生成图像验证码的方法小结(2种方法)
2016/07/18 PHP
ThinkPHP打水印及设置水印位置的方法
2016/10/14 PHP
前端轻量级MVC框架CanJS详解
2014/09/26 Javascript
js实现图片缓慢放大缩小效果
2016/08/02 Javascript
树结构之JavaScript
2017/01/24 Javascript
Angular.JS中的指令引用template与指令当做属性详解
2017/03/30 Javascript
jQuery简单判断值是否存在于数组中的方法示例
2018/04/17 jQuery
webpack项目轻松混用css module的方法
2018/06/12 Javascript
vue使用Element组件时v-for循环里的表单项验证方法
2018/06/28 Javascript
vue-cli3.0+element-ui上传组件el-upload的使用
2018/12/03 Javascript
使用p5.js临摹动态图形
2019/10/23 Javascript
JS数组reduce()方法原理及使用技巧解析
2020/07/14 Javascript
[01:57]2018年度DOTA2最具潜力解说-完美盛典
2018/12/16 DOTA
python网页请求urllib2模块简单封装代码
2014/02/07 Python
利用Python实现颜色色值转换的小工具
2016/10/27 Python
python 含子图的gif生成时内存溢出的方法
2019/07/07 Python
python爬虫 线程池创建并获取文件代码实例
2019/09/28 Python
OpenCV Python实现图像指定区域裁剪
2021/03/12 Python
css3背景图片透明叠加属性cross-fade简介及用法实例
2013/01/08 HTML / CSS
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
英国最大的化装舞会服装网站:Fancydress.com
2017/08/15 全球购物
澳大利亚设计师服装在线:MISHA
2019/10/07 全球购物
MATCHESFASHION澳大利亚/亚太地区:英国时尚奢侈品电商
2020/01/14 全球购物
俄罗斯GamePark游戏商店网站:购买游戏、游戏机和配件
2020/03/13 全球购物
物流司机岗位职责
2013/12/28 职场文书
幼儿园中秋节活动方案
2014/02/06 职场文书
社区关爱留守儿童活动方案
2014/08/22 职场文书
幼儿园中班个人总结
2015/02/28 职场文书
毕业生捐书活动倡议书
2015/04/27 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
2019年工作总结范文
2019/05/21 职场文书
小学生作文之《压岁钱的烦恼》
2019/09/27 职场文书
解决python绘图使用subplots出现标题重叠的问题
2021/04/30 Python
Python实现日志实时监测的示例详解
2022/04/06 Python
提高系统的吞吐量解决数据库重复写入问题
2022/04/23 MySQL