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编码时应该注意的几个情况
Mar 04 Python
python爬虫教程之爬取百度贴吧并下载的示例
Mar 07 Python
python实现线程池的方法
Jun 30 Python
详解用python实现简单的遗传算法
Jan 02 Python
python解决pandas处理缺失值为空字符串的问题
Apr 08 Python
Python实现深度遍历和广度遍历的方法
Jan 22 Python
对PyQt5中树结构的实现方法详解
Jun 17 Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
Oct 14 Python
python中p-value的实现方式
Dec 16 Python
scrapy数据存储在mysql数据库的两种方式(同步和异步)
Feb 18 Python
python编程进阶之类和对象用法实例分析
Feb 21 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
Jun 30 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缓存技术介绍
2006/11/25 PHP
深入探讨:PHP使用数据库永久连接方式操作MySQL的是与非
2013/06/05 PHP
php fsockopen解决办法 php实现多线程
2014/01/20 PHP
PHP实现下载断点续传的方法
2014/11/12 PHP
PHP Callable强制指定回调类型的方法
2016/08/30 PHP
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
js opener的使用详解
2014/01/11 Javascript
JavaScript function 的 length 属性使用介绍
2014/09/15 Javascript
纯js实现无限空间大小的本地存储
2015/06/18 Javascript
js遍历json的key和value的实例
2017/01/22 Javascript
通俗易懂地解释JS中的闭包
2017/10/23 Javascript
小程序tab页无法传递参数的方法
2018/08/03 Javascript
对angularJs中ng-style动态改变样式的实例讲解
2018/09/30 Javascript
微信小程序里引入SVG矢量图标的方法
2019/09/20 Javascript
layui table复选框禁止某几条勾选的实例
2019/09/20 Javascript
[02:56]《DAC最前线》之国外战队抵达上海备战亚洲邀请赛
2015/01/28 DOTA
[02:33]2018 DOTA2亚洲邀请赛回顾视频 再次拾起那些美妙的时刻
2018/04/10 DOTA
[49:41]NB vs NAVI Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
Python FTP操作类代码分享
2014/05/13 Python
Python使用MD5加密字符串示例
2014/08/22 Python
pandas修改DataFrame列名的方法
2018/04/08 Python
Python内存读写操作示例
2018/07/18 Python
详解Python连接MySQL数据库的多种方式
2019/04/16 Python
python scrapy爬虫代码及填坑
2019/08/12 Python
PyCharm取消波浪线、下划线和中划线的实现
2020/03/03 Python
Cpython解释器中的GIL全局解释器锁
2020/11/09 Python
一款html5 canvas实现的图片玻璃碎片特效
2014/09/11 HTML / CSS
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
2020/08/24 HTML / CSS
Internal修饰符有什么含义
2013/07/10 面试题
学习经验交流会主持词
2014/04/01 职场文书
保险专业求职信
2014/07/07 职场文书
2015年采购工作总结
2015/04/10 职场文书
工作收入证明模板
2015/06/12 职场文书
找规律教学反思
2016/02/23 职场文书
导游词之上海杜莎夫人蜡像馆
2019/11/22 职场文书