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实现CET查分的方法
Mar 10 Python
Anaconda多环境多版本python配置操作方法
Sep 12 Python
Python实现返回数组中第i小元素的方法示例
Dec 04 Python
python如何定义带参数的装饰器
Mar 20 Python
python抓取京东小米8手机配置信息
Nov 13 Python
python 多个参数不为空校验方法
Feb 14 Python
python3通过selenium爬虫获取到dj商品的实例代码
Apr 25 Python
Python进阶:生成器 懒人版本的迭代器详解
Jun 29 Python
Pytorch卷积层手动初始化权值的实例
Aug 17 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
Aug 26 Python
python实现简单颜色识别程序
Feb 19 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
Jul 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
德劲1102收音机的打理维修案例
2021/03/02 无线电
ASP知识讲座四
2006/10/09 PHP
用PHP实现的生成静态HTML速度快类库
2007/03/31 PHP
PHP分页详细讲解(有实例)
2013/10/30 PHP
PHP用星号隐藏部份用户名、身份证、IP、手机号等实例
2014/04/08 PHP
php生成唯一的订单函数分享
2015/02/02 PHP
PHP的Yii框架中使用数据库的配置和SQL操作实例教程
2016/03/17 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
ThinkPHP 模板substr的截取字符串函数详解
2017/01/09 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
2019/05/29 PHP
解决laravel id非自增 模型取回为0 的问题
2019/10/11 PHP
EXTJS内使用ACTIVEX控件引起崩溃问题的解决方法
2010/03/31 Javascript
AngularJS单选框及多选框实现双向动态绑定
2016/01/13 Javascript
jQuery实现摸拟alert提示框
2016/05/22 Javascript
对象转换为原始值的实现方法
2016/06/06 Javascript
AngularJS路由删除#符号解决的办法
2017/09/28 Javascript
BootStrap TreeView使用实例详解
2017/11/01 Javascript
jQuery实现动态添加节点与遍历节点功能示例
2017/11/09 jQuery
深入理解JS的事件绑定、事件流模型
2018/05/13 Javascript
关于vue的列表图片选中打钩操作
2020/09/09 Javascript
JavaScript用document.write()输出换行的示例代码
2020/11/26 Javascript
使用Node.js和Socket.IO扩展Django的实时处理功能
2015/04/20 Python
python模糊图片过滤的方法
2018/12/14 Python
Python操作SQLite/MySQL/LMDB数据库的方法
2019/11/07 Python
python Shapely使用指南详解
2020/02/18 Python
HTML5 Canvas 起步(2) - 路径
2009/05/12 HTML / CSS
Cotton On南非:澳洲时尚平价品牌
2018/06/28 全球购物
党委书记岗位职责
2013/11/24 职场文书
语文教研活动总结
2014/07/02 职场文书
合作协议书范文
2014/08/20 职场文书
2014班子成员自我剖析材料思想汇报
2014/10/01 职场文书
公司市场部岗位职责
2015/04/15 职场文书
道歉的话语大全
2015/05/12 职场文书
女方离婚起诉书
2015/05/18 职场文书
2015年乡镇安全生产工作总结
2015/05/19 职场文书
Django开发RESTful API实现增删改查(入门级)
2021/05/10 Python