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的汉字转GBK码实现代码
Feb 19 Python
在win和Linux系统中python命令行运行的不同
Jul 03 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
Feb 19 Python
Python中按值来获取指定的键
Mar 04 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
Jun 26 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
Sep 20 Python
浅析PEP572: 海象运算符
Oct 15 Python
Python 爬虫实现增加播客访问量的方法实现
Oct 31 Python
django 链接多个数据库 并使用原生sql实现
Mar 28 Python
离线状态下在jupyter notebook中使用plotly实例
Apr 24 Python
一文轻松掌握python语言命名规范规则
Jun 18 Python
详解torch.Tensor的4种乘法
Sep 03 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
收音机鉴频器对声音的影响和频偏分析
2021/03/02 无线电
PHP设计模式之委托模式定义与用法简单示例
2018/08/13 PHP
php把文件设置为插件的技巧方法
2020/02/03 PHP
使用Rancher在K8S上部署高性能PHP应用程序的教程
2020/07/10 PHP
Chrome Form多次提交表单问题的解决方法
2011/05/09 Javascript
javascript获取form里的表单元素的示例代码
2014/02/14 Javascript
js确认删除对话框效果的示例代码
2014/02/20 Javascript
jQuery的animate函数学习记录
2014/08/08 Javascript
容易造成JavaScript内存泄露几个方面
2014/09/04 Javascript
javascript实现表格排序 编辑 拖拽 缩放
2015/01/02 Javascript
javascript中的作用域和闭包详解
2016/01/13 Javascript
基于jQuery的Web上传插件Uploadify使用示例
2016/05/19 Javascript
onmouseover事件和onmouseout事件全面理解
2016/08/15 Javascript
Bootstrap3 内联单选和多选框
2016/12/29 Javascript
JavaScript省市级联下拉菜单实例
2017/02/14 Javascript
vue中activated的用法
2021/01/03 Vue.js
javascript实现点击产生随机图形
2021/01/25 Javascript
Python实现获取网站PR及百度权重
2015/01/21 Python
Windows下搭建python开发环境详细步骤
2020/07/20 Python
python代码实现ID3决策树算法
2017/12/20 Python
浅谈python实现Google翻译PDF,解决换行的问题
2018/11/28 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
2019/10/12 Python
使用IPython或Spyder将省略号表示的内容完整输出
2020/04/20 Python
Python装饰器结合递归原理解析
2020/07/02 Python
25个CSS3动画按钮和菜单教程分享
2012/10/03 HTML / CSS
CSS3中的Transition过度与Animation动画属性使用要点
2016/05/20 HTML / CSS
css3实现简单的白云飘动背景特效
2020/10/28 HTML / CSS
html5 touch事件实现触屏页面上下滑动(一)
2016/03/10 HTML / CSS
html5将图片转换成base64的实例代码
2016/09/21 HTML / CSS
DKNY品牌官网:纽约大都会时尚风格
2016/10/20 全球购物
毕业生求职自荐书范文
2014/03/27 职场文书
公司会议策划方案
2014/05/17 职场文书
2015年初中元旦晚会活动总结
2014/11/28 职场文书
农业项目合作意向书
2015/05/08 职场文书
2016十一国庆节感言
2015/12/09 职场文书