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之有容乃大的list(4)
Sep 28 Python
Python基于scrapy采集数据时使用代理服务器的方法
Apr 16 Python
Linux下为不同版本python安装第三方库
Aug 31 Python
使用Python对Excel进行读写操作
Mar 30 Python
浅谈Python使用Bottle来提供一个简单的web服务
Dec 27 Python
django认证系统实现自定义权限管理的方法
Jul 16 Python
运用PyTorch动手搭建一个共享单车预测器
Aug 06 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
Dec 23 Python
Python动态声明变量赋值代码实例
Dec 30 Python
关于tf.reverse_sequence()简述
Jan 20 Python
Python 中的pygame安装与配置教程详解
Feb 10 Python
学习Python爬虫的几点建议
Aug 05 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中ob(Output Buffer 输出缓冲)函数使用方法
2007/07/21 PHP
解析php二分法查找数组是否包含某一元素
2013/05/23 PHP
php的ajax简单实例
2014/02/27 PHP
详解php中空字符串和0之间的关系
2016/10/23 PHP
PHP程序员学习使用Swoole的理由
2018/06/24 PHP
javaScript矢量图表库-gRaphael几行代码实现精美的条形图/饼图/点图/曲线图
2013/01/09 Javascript
document.write()及其输出内容的样式、位置控制
2013/08/12 Javascript
jquery退出each循环的写法
2014/02/26 Javascript
js使用Array.prototype.sort()对数组对象排序的方法
2015/01/28 Javascript
js实现屏幕自适应局部代码分享
2015/01/30 Javascript
JavaScript实现MIPS乘法模拟的方法
2015/04/17 Javascript
javascript实现点击商品列表checkbox实时统计金额的方法
2015/05/15 Javascript
Jquery使用css方法改变样式实例
2015/05/18 Javascript
javascript实现根据3原色制作颜色选择器的方法
2015/07/17 Javascript
bootstrap模态框远程示例代码分享
2017/05/22 Javascript
JS一个简单的注册页面实例
2017/09/05 Javascript
JS常用的几种数组遍历方式以及性能分析对比实例详解
2018/04/11 Javascript
详解webpack打包第三方类库的正确姿势
2018/10/20 Javascript
Vue通过WebSocket建立长连接的实现代码
2019/11/05 Javascript
JS脚本实现定时到网站上签到/签退功能
2020/04/22 Javascript
浅谈Python类的__getitem__和__setitem__特殊方法
2016/12/25 Python
对Python闭包与延迟绑定的方法详解
2019/01/07 Python
python中break、continue 、exit() 、pass终止循环的区别详解
2019/07/08 Python
Python 通过截图匹配原图中的位置(opencv)实例
2019/08/27 Python
python学生信息管理系统实现代码
2019/12/17 Python
Python基于内置库pytesseract实现图片验证码识别功能
2020/02/24 Python
Python使用monkey.patch_all()解决协程阻塞问题
2020/04/15 Python
Python私有属性私有方法应用实例解析
2020/09/15 Python
Python __slots__的使用方法
2020/11/15 Python
CSS3实现点击放大的动画实例代码
2017/02/27 HTML / CSS
html5实现九宫格抽奖可固定抽中某项奖品
2020/06/15 HTML / CSS
银行实习生的自我评价
2014/01/13 职场文书
医院竞聘演讲稿
2014/05/16 职场文书
我是一名护士演讲稿
2014/08/28 职场文书
拆迁委托协议书
2014/09/15 职场文书
Windows Server 2012配置DNS服务器的方法
2022/04/29 Servers