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 Matplotlib库入门指南
May 18 Python
python使用PIL模块实现给图片打水印的方法
May 22 Python
zookeeper python接口实例详解
Jan 18 Python
图解Python变量与赋值
Apr 03 Python
Python读取数据集并消除数据中的空行方法
Jul 12 Python
python 同时运行多个程序的实例
Jan 07 Python
python实现控制电脑鼠标和键盘,登录QQ的方法示例
Jul 06 Python
python实现大战外星人小游戏实例代码
Dec 26 Python
PyTorch 解决Dataset和Dataloader遇到的问题
Jan 08 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
Feb 17 Python
Python3.9又更新了:dict内置新功能
Feb 28 Python
解决pycharm 格式报错tabs和space不一致问题
Feb 26 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代码简化
2010/02/08 PHP
Mac OS下配置PHP+MySql环境
2015/02/25 PHP
Symfony2创建基于域名的路由相关示例
2016/11/14 PHP
用函数式编程技术编写优美的 JavaScript
2006/11/25 Javascript
收藏一些不常用,但是有用的代码
2007/03/12 Javascript
JavaScript的public、private和privileged模式
2009/12/28 Javascript
js 实现打印网页中定义的部分内容的代码
2010/04/01 Javascript
javascript写的简单的计算器,内容很多,方法实用,推荐
2011/12/29 Javascript
JQuery中form验证出错信息的查看方法
2013/10/08 Javascript
详解JS异步加载的三种方式
2017/03/07 Javascript
微信小程序canvas写字板效果及实例
2017/06/15 Javascript
Vue2.0 组件传值通讯的示例代码
2017/08/01 Javascript
判断jQuery是否加载完成,没完成继续判断的解决方法
2017/12/06 jQuery
JS求1到任意数之间的所有质数的方法详解
2019/05/20 Javascript
轻松学习JavaScript函数中的 Rest 参数
2019/05/30 Javascript
vue集成kindeditor富文本的实现示例代码
2019/06/07 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
[05:06]2017亚洲邀请赛DAC回顾片
2017/04/19 DOTA
[55:32]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第二场
2018/04/05 DOTA
Python提取频域特征知识点浅析
2019/03/04 Python
python打包成so文件过程解析
2019/09/28 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
2020/02/07 Python
Python3自定义json逐层解析器代码
2020/05/11 Python
python中的对数log函数表示及用法
2020/12/09 Python
HTML5添加鼠标悬浮音响效果不使用FLASH
2014/04/23 HTML / CSS
印尼最大的在线购物网站:MatahariMall.com
2016/08/26 全球购物
美国网上订购鲜花:FTD
2016/09/23 全球购物
经典的班主任推荐信
2013/10/28 职场文书
大学生就业推荐信范文
2013/11/29 职场文书
主持人演讲稿范文
2013/12/28 职场文书
《第一朵杏花》教学反思
2014/04/16 职场文书
秋天的怀念教学反思
2014/04/28 职场文书
社区元宵节活动总结
2015/02/06 职场文书
社区三八妇女节活动总结
2015/02/06 职场文书
工作简历自我评价
2015/03/11 职场文书
用Python可视化新冠疫情数据
2022/01/18 Python