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基础教程之异常详解
Jan 10 Python
Django框架模板介绍
Jan 15 Python
Python3.0中普通方法、类方法和静态方法的比较
May 03 Python
Pycharm新手教程(只需要看这篇就够了)
Jun 18 Python
python画图的函数用法以及技巧
Jun 28 Python
Flask框架学习笔记之消息提示与异常处理操作详解
Aug 15 Python
python扫描线填充算法详解
Feb 19 Python
Django 404、500页面全局配置知识点详解
Mar 10 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
Apr 22 Python
python3.7添加dlib模块的方法
Jul 01 Python
使用Python实现NBA球员数据查询小程序功能
Nov 09 Python
python中mongodb包操作数据库
Apr 19 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实现选择排序的解决方法
2013/05/04 PHP
深入探讨:PHP使用数据库永久连接方式操作MySQL的是与非
2013/06/05 PHP
PHP实现的支付宝支付功能示例
2019/03/26 PHP
PHP代码覆盖率统计详解
2020/07/22 PHP
Javascript倒计时页面跳转实例小结
2013/09/11 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
js实现上传图片预览的方法
2015/02/09 Javascript
移动端JQ插件hammer使用详解
2015/07/03 Javascript
常用的Javascript设计模式小结
2015/12/09 Javascript
JavaScript String(字符串)对象的简单实例(推荐)
2016/08/31 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
2016/11/22 Javascript
Node.js Mongodb 密码特殊字符 @的解决方法
2017/04/11 Javascript
jQuery封装animate.css的实例
2018/01/04 jQuery
详解vue+webpack+express中间件接口使用
2018/07/17 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
2019/05/14 Javascript
vue element自定义表单验证请求后端接口验证
2019/12/11 Javascript
Node.js 在本地生成日志文件的方法
2020/02/07 Javascript
vue+element-ui JYAdmin后台管理系统模板解析
2020/07/28 Javascript
js实现磁性吸附的示例
2020/10/26 Javascript
vue组件添加事件@click.native操作
2020/10/30 Javascript
python 采集中文乱码问题的完美解决方法
2016/09/27 Python
pandas 获取季度,月度,年度首尾日期的方法
2018/04/11 Python
Python实现定时精度可调节的定时器
2018/04/15 Python
Flask框架模板继承实现方法分析
2019/07/31 Python
使用python代码进行身份证号校验的实现示例
2019/11/21 Python
Django values()和value_list()的使用
2020/03/31 Python
Matplotlib配色之Colormap详解
2021/01/05 Python
钉钉企业内部H5微应用开发详解
2020/05/12 HTML / CSS
林清轩官方网站:山茶花润肤油开创者
2016/10/26 全球购物
全球精选男装和家居用品:Article
2020/04/13 全球购物
一道输出判断型Java面试题
2014/10/01 面试题
公证委托书格式
2014/09/13 职场文书
购房委托书
2014/10/15 职场文书
服务整改报告
2014/11/06 职场文书
周一问候语大全
2015/11/10 职场文书
Python OpenCV超详细讲解基本功能
2022/04/02 Python