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中操作时间之strptime()方法的使用
Dec 30 Python
python3实现ftp服务功能(客户端)
Mar 24 Python
Python多层装饰器用法实例分析
Feb 09 Python
python3.x 将byte转成字符串的方法
Jul 17 Python
windows下 兼容Python2和Python3的解决方法
Dec 05 Python
Python读取Pickle文件信息并计算与当前时间间隔的方法分析
Jan 30 Python
Django框架使用内置方法实现登录功能详解
Jun 12 Python
使用virtualenv创建Python环境及PyQT5环境配置的方法
Sep 10 Python
如何通过python实现全排列
Feb 11 Python
150行Python代码实现带界面的数独游戏
Apr 04 Python
Python csv文件记录流程代码解析
Jul 16 Python
Django crontab定时任务模块操作方法解析
Sep 10 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数组中删除元素的实现代码
2012/06/22 PHP
ECMall支持SSL连接邮件服务器的配置方法详解
2014/05/19 PHP
PHP反向代理类代码
2014/08/15 PHP
php操纵mysqli数据库的实现方法
2016/09/18 PHP
如何用PHP做到页面注册审核
2017/03/02 PHP
Thinkphp自定义生成缩略图尺寸的方法
2019/08/05 PHP
Laravel Eloquent ORM 多条件查询的例子
2019/10/10 PHP
jquery实现表格本地排序的方法
2015/03/11 Javascript
基于jQuery实现的双11天猫拆红包抽奖效果
2015/12/01 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
2015/12/02 Javascript
基于JSON格式数据的简单jQuery幻灯片插件(jquery-slider)
2016/08/10 Javascript
百度地图JavascriptApi Marker平滑移动及车头指向行径方向
2017/03/13 Javascript
详解vue mixins和extends的巧妙用法
2017/12/20 Javascript
React中使用UEditor百度富文本的方法
2018/08/22 Javascript
js事件触发操作实例分析
2019/06/21 Javascript
Vue实现日历小插件
2019/06/26 Javascript
python获得一个月有多少天的方法
2015/06/04 Python
酷! 程序员用Python带你玩转冲顶大会
2018/01/17 Python
python3.6+opencv3.4实现鼠标交互查看图片像素
2018/02/26 Python
python使用tornado实现简单爬虫
2018/07/28 Python
Python在图片中插入大量文字并且自动换行
2019/01/02 Python
python 批量添加的button 使用同一点击事件的方法
2019/07/17 Python
python实现截取屏幕保存文件,删除N天前截图的例子
2019/08/27 Python
python中open函数的基本用法示例
2019/09/07 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
2020/06/18 Python
python 实现数据库中数据添加、查询与更新的示例代码
2020/12/07 Python
eDreams加拿大:廉价航班、酒店和度假
2019/03/29 全球购物
个人自我剖析材料
2014/02/07 职场文书
新闻学专业大学生职业生涯规划范文
2014/03/02 职场文书
运动会口号16字
2014/06/07 职场文书
人力资源管理专业自荐书
2014/07/07 职场文书
市场营销专业毕业生求职信
2014/07/21 职场文书
小学优秀教师事迹材料
2014/12/16 职场文书
朝花夕拾读书笔记
2015/06/29 职场文书
保护环境建议书作文500字
2015/09/14 职场文书
php修改word的实例方法
2021/11/17 PHP