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基础教程之获取本机ip数据包示例
Feb 10 Python
利用Python的Django框架中的ORM建立查询API
Apr 20 Python
python实现在字符串中查找子字符串的方法
Jul 11 Python
python编写弹球游戏的实现代码
Mar 12 Python
Python测试网络连通性示例【基于ping】
Aug 03 Python
Python实现12306火车票抢票系统
Jul 04 Python
pygame实现俄罗斯方块游戏(基础篇3)
Oct 29 Python
基于pycharm实现批量修改变量名
Jun 02 Python
详解anaconda离线安装pytorchGPU版
Sep 08 Python
如何在vscode中安装python库的方法步骤
Jan 06 Python
Python快速优雅的批量修改Word文档样式
May 20 Python
python实现A*寻路算法
Jun 13 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 Ajax乱码
2008/04/09 PHP
PHP 引用是个坏习惯
2010/03/12 PHP
Base64在线编码解码实现代码 演示与下载
2011/01/08 PHP
php+mysql数据库查询实例
2015/01/21 PHP
php+MySql实现登录系统与输出浏览者信息功能
2016/07/01 PHP
ThinkPHP5框架缓存查询操作分析
2018/05/30 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
2018/08/15 PHP
为数据添加append,remove功能
2006/10/03 Javascript
使用隐藏的new来创建对象
2011/03/29 Javascript
node.js中的http.get方法使用说明
2014/12/14 Javascript
js实现仿Discuz文本框弹出层效果
2015/08/13 Javascript
详解Javascript中的原型OOP
2016/10/12 Javascript
Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法
2016/12/31 Javascript
Angularjs实现控制器之间通信方式实例总结
2018/03/27 Javascript
nodejs高大上的部署方式(PM2)
2018/09/11 NodeJs
vue2.0结合Element-ui实战案例
2019/03/06 Javascript
python生成日历实例解析
2014/08/21 Python
Window 64位下python3.6.2环境搭建图文教程
2018/09/19 Python
详解用python实现基本的学生管理系统(文件存储版)(python3)
2019/04/25 Python
python批量解压zip文件的方法
2019/08/20 Python
python错误调试及单元文档测试过程解析
2019/12/19 Python
Pytorch 高效使用GPU的操作
2020/06/27 Python
REISS英国官网:伦敦High Street最受欢迎品牌
2016/12/21 全球购物
初中体育教学反思
2014/01/14 职场文书
成龙霸王洗发水广告词
2014/03/14 职场文书
校园歌咏比赛主持词
2014/03/18 职场文书
挂靠协议书范本
2014/04/22 职场文书
班级学习计划书
2014/04/27 职场文书
团结就是力量演讲稿
2014/05/21 职场文书
讲文明懂礼貌演讲稿
2014/09/11 职场文书
小学家长通知书评语
2014/12/31 职场文书
狂人日记读书笔记
2015/06/30 职场文书
2016入党积极分子党课学习心得体会
2015/10/09 职场文书
《鲸》教学反思
2016/02/23 职场文书
《鲁滨逊漂流记》之六读后感(4篇)
2019/09/29 职场文书
解决ObjectMapper.convertValue() 遇到的一些问题
2021/06/30 Java/Android