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实现从ftp服务器下载文件的方法
Apr 30 Python
简单解决Python文件中文编码问题
Nov 22 Python
python判断设备是否联网的方法
Jun 29 Python
python三大神器之fabric使用教程
Jun 10 Python
django rest framework vue 实现用户登录详解
Jul 29 Python
python3安装crypto出错及解决方法
Jul 30 Python
python使用正则表达式(Regular Expression)方法超详细
Dec 30 Python
pytorch程序异常后删除占用的显存操作
Jan 13 Python
keras自定义回调函数查看训练的loss和accuracy方式
May 23 Python
Python Socket TCP双端聊天功能实现过程详解
Jun 15 Python
Python:__eq__和__str__函数的使用示例
Sep 26 Python
python编写五子棋游戏
May 25 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
对Session和Cookie的区分与解释
2007/03/16 PHP
php获取url字符串截取路径的文件名和扩展名的函数
2010/01/22 PHP
PHP中文件上传的一个问题
2010/09/04 PHP
php后台如何避免用户直接进入方法实例
2013/10/15 PHP
Laravel框架源码解析之入口文件原理分析
2020/05/14 PHP
JavaScript 未结束的字符串常量常见解决方法
2010/01/24 Javascript
js post方式传递提交的实现代码
2010/05/31 Javascript
addEventListener()第三个参数useCapture (Boolean)详细解析
2013/11/07 Javascript
Extjs改变树节点的勾选状态点击按钮将复选框去掉
2013/11/14 Javascript
自写的jQuery异步加载数据添加事件
2014/05/15 Javascript
jquery获取img的src值的简单实例
2016/05/17 Javascript
vue.js学习之vue-cli定制脚手架详解
2017/07/02 Javascript
vue动态绑定class选中当前列表变色的方法示例
2018/12/19 Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
2019/09/03 jQuery
JavaScript实现与web通信的方法详解
2020/08/07 Javascript
python爬虫 使用真实浏览器打开网页的两种方法总结
2018/04/21 Python
Python判断一个三位数是否为水仙花数的示例
2018/11/13 Python
python找出因数与质因数的方法
2019/07/25 Python
python-Web-flask-视图内容和模板知识点西宁街
2019/08/23 Python
基于tensorflow __init__、build 和call的使用小结
2021/02/26 Python
CSS3 Columns分列式布局方法简介
2014/05/03 HTML / CSS
使用CSS禁止textarea调整大小功能的方法
2015/03/13 HTML / CSS
IE9对HTML5中部分属性不支持的原因分析
2014/10/15 HTML / CSS
html5手机键盘弹出收起的处理
2020/01/20 HTML / CSS
教师自我鉴定范文
2013/11/10 职场文书
企业行政文员岗位职责
2013/12/03 职场文书
最热门的自我评价
2013/12/30 职场文书
自荐信的格式
2014/03/10 职场文书
函授本科个人自我鉴定
2014/03/25 职场文书
查摆问题自我剖析材料
2014/08/18 职场文书
2014年材料员工作总结
2014/11/19 职场文书
领导干部失职检讨书
2015/05/05 职场文书
办公室卫生管理制度
2015/08/04 职场文书
关于Mybatis中SQL节点的深入解析
2022/03/19 Java/Android
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
2022/05/25 SQL Server
win10壁纸在哪个文件夹 win10桌面背景图片文件位置分享
2022/08/05 数码科技