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服务器与android客户端socket通信实例
Nov 12 Python
python中self原理实例分析
Apr 30 Python
如何准确判断请求是搜索引擎爬虫(蜘蛛)发出的请求
Oct 13 Python
Python判断变量是否为Json格式的字符串示例
May 03 Python
Python实现多线程的两种方式分析
Aug 29 Python
python scp 批量同步文件的实现方法
Jan 03 Python
python中for循环变量作用域及用法详解
Nov 05 Python
更新升级python和pip版本后不生效的问题解决
Apr 17 Python
解决python使用list()时总是报错的问题
May 05 Python
Python requests HTTP验证登录实现流程
Nov 05 Python
Django扫码抽奖平台的配置过程详解
Jan 14 Python
教你怎么用python selenium实现自动化测试
May 27 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
用ODBC的分页显示
2006/10/09 PHP
简单的方法让你的后台登录更加安全(php中加session验证)
2012/08/22 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
Smarty分页实现方法完整实例
2016/05/11 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
phpStudy vscode 搭建debug调试的教程详解
2020/07/28 PHP
prototype与jquery下Ajax实现的差别
2009/09/13 Javascript
精通JavaScript 纠正 cleanWhitespace函数
2010/03/11 Javascript
JS对字符串编码的几种方式使用指南
2015/05/14 Javascript
理解javascript闭包
2015/12/15 Javascript
如何在JS中实现相互转换XML和JSON
2016/07/19 Javascript
jQuery可见性过滤选择器用法示例
2016/09/09 Javascript
Vue中如何实现轮播图的示例代码
2017/07/27 Javascript
Vue实现active点击切换方法
2018/03/16 Javascript
基于JavaScript实现一个简单的Vue
2018/09/26 Javascript
es6中使用map简化复杂条件判断操作实例详解
2020/02/19 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
基于vue实现简易打地鼠游戏
2020/08/21 Javascript
python中的__init__ 、__new__、__call__小结
2014/04/25 Python
Eclipse和PyDev搭建完美Python开发环境教程(Windows篇)
2016/11/16 Python
Python实现复杂对象转JSON的方法示例
2017/06/22 Python
如何使用django的MTV开发模式返回一个网页
2019/07/22 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
python 实现线程之间的通信示例
2020/02/14 Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
2020/02/27 Python
树莓派升级python的具体步骤
2020/07/05 Python
python实现图书馆抢座(自动预约)功能的示例代码
2020/09/29 Python
详解如何在css中引入自定义字体(font-face)
2018/05/17 HTML / CSS
原生 JS+CSS+HTML 实现时序图的方法
2019/07/31 HTML / CSS
HQhair美国/加拿大:英国化妆品、美容及美发产品商城
2019/04/15 全球购物
欧舒丹俄罗斯官方网站:L’OCCITANE俄罗斯
2019/11/22 全球购物
超市促销实习自我鉴定
2013/09/23 职场文书
实习老师离校感言
2014/02/03 职场文书
高级销售求职信
2014/02/21 职场文书
2015年初中生自我评价范文
2015/03/03 职场文书
上班迟到检讨书范文
2015/05/06 职场文书