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中的__slots__缓存资源以节省内存开销的方法
Apr 02 Python
Django中的“惰性翻译”方法的相关使用
Jul 27 Python
python库lxml在linux和WIN系统下的安装
Jun 24 Python
实例讲解Python爬取网页数据
Jul 08 Python
在双python下设置python3为默认的方法
Oct 31 Python
浅谈Pandas:Series和DataFrame间的算术元素
Dec 22 Python
对python函数签名的方法详解
Jan 22 Python
使用Python中的reduce()函数求积的实例
Jun 28 Python
python requests证书问题解决
Sep 05 Python
Python Sphinx使用实例及问题解决
Jan 17 Python
浅谈django 重载str 方法
May 19 Python
利用Python脚本写端口扫描器socket,python-nmap
Jul 23 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的宝库目录--PEAR
2006/10/09 PHP
PHP异步调用socket实现代码
2012/01/12 PHP
php代码架构的八点注意事项
2016/01/25 PHP
JavaScript 数组的 uniq 方法
2008/01/23 Javascript
基于JQuery实现相同内容合并单元格的代码
2011/01/12 Javascript
JS获取当前日期和时间的简单实例
2013/11/19 Javascript
js 显示base64编码的二进制流网页图片
2014/04/04 Javascript
AngularJS模块管理问题的非常规处理方法
2015/04/29 Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
2015/11/30 Javascript
jQuery实现的左右移动焦点图效果
2016/01/14 Javascript
Node.js复制文件的方法示例
2016/12/29 Javascript
详解Node中导入模块require和import的区别
2017/08/11 Javascript
Vue组件之自定义事件的功能图解
2018/02/01 Javascript
WebGL学习教程之Three.js学习笔记(第一篇)
2019/04/25 Javascript
微信小程序云开发修改云数据库中的数据方法
2019/05/18 Javascript
js实现跟随鼠标移动的小球
2019/08/26 Javascript
python实现各进制转换的总结大全
2017/06/18 Python
Python产生Gnuplot绘图数据的方法
2018/11/09 Python
pycharm运行和调试不显示结果的解决方法
2018/11/30 Python
Django框架中间件(Middleware)用法实例分析
2019/05/24 Python
Python传递参数的多种方式(小结)
2019/09/18 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
2019/12/06 Python
解决tensorboard多个events文件显示紊乱的问题
2020/02/15 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
2020/02/27 Python
python中not、and和or的优先级与详细用法介绍
2020/11/03 Python
pytorch加载语音类自定义数据集的方法教程
2020/11/10 Python
Under Armour瑞典官方网站:美国高端运动科技品牌
2018/11/21 全球购物
生物制药毕业生自荐信
2013/10/16 职场文书
社区端午节活动方案
2014/01/28 职场文书
办公室主任职责范本
2014/03/07 职场文书
《窗前的气球》教学反思
2014/04/07 职场文书
行政求职信
2014/07/04 职场文书
人身损害赔偿协议书格式
2014/11/01 职场文书
2015年采购部工作总结
2015/04/23 职场文书
2015年汽车销售员工作总结
2015/07/24 职场文书
《唯一的听众》教学反思
2016/02/18 职场文书