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使用htpasswd实现基本认证授权的例子
Jun 10 Python
Python实现简单截取中文字符串的方法
Jun 15 Python
深入理解python中的浅拷贝和深拷贝
May 30 Python
实例讲解Python的函数闭包使用中应注意的问题
Jun 20 Python
对Python模块导入时全局变量__all__的作用详解
Jan 11 Python
在Pycharm terminal中字体大小设置的方法
Jan 16 Python
对pandas通过索引提取dataframe的行方法详解
Feb 01 Python
使用python实现ftp的文件读写方法
Jul 02 Python
关于python3中setup.py小概念解析
Aug 22 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
Nov 15 Python
python实现批量处理将图片粘贴到另一张图片上并保存
Dec 12 Python
python如何实现不可变字典inmutabledict
Jan 08 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编程语言开发动态WAP页面
2006/10/09 PHP
PHP中for循环语句的几种变型
2006/11/26 PHP
解析在apache里面给php写虚拟目录的详细方法
2013/06/24 PHP
php图像处理类实例
2015/07/28 PHP
PHP开发的微信现金红包功能示例
2017/06/29 PHP
JS实多级联动下拉菜单类,简单实现省市区联动菜单!
2007/05/03 Javascript
基于jQuery的星级评分插件
2011/08/12 Javascript
JS原型对象通俗"唱法"
2012/12/27 Javascript
nodejs教程之异步I/O
2014/11/21 NodeJs
轻松实现jquery选项卡切换效果
2016/10/10 Javascript
详解js中Json的语法与格式
2016/11/22 Javascript
js获取指定时间的前几秒
2017/04/05 Javascript
JS库之Highlight.js的用法详解
2017/09/13 Javascript
利用百度地图API获取当前位置信息的实例
2017/11/06 Javascript
浅谈vue项目如何打包扔向服务器
2018/05/08 Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
2018/08/10 Javascript
React中使用外部样式的3种方式(小结)
2019/05/28 Javascript
[15:41]教你分分钟做大人——灰烬之灵
2015/03/11 DOTA
[44:04]OG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python 元组(Tuple)操作详解
2014/03/11 Python
轻松掌握python设计模式之访问者模式
2016/11/18 Python
python 多线程串行和并行的实例
2019/02/22 Python
Django实现auth模块下的登录注册与注销功能
2019/10/10 Python
python实现图像拼接功能
2020/03/23 Python
详解HTML5通讯录获取指定多个人的信息
2016/12/20 HTML / CSS
企业面试题试卷附带答案
2015/12/20 面试题
运动会通讯稿500字
2014/02/20 职场文书
环保建议书600字
2014/05/14 职场文书
运动会口号大全
2014/06/07 职场文书
部门群众路线教育实践活动对照检查材料思想汇报
2014/10/07 职场文书
党员违纪检讨书怎么写
2014/11/01 职场文书
交通事故协议书范本
2014/11/18 职场文书
婚礼嘉宾致辞
2015/07/28 职场文书
农贸批发市场管理制度
2015/08/07 职场文书
go语言基础 seek光标位置os包的使用
2021/05/09 Golang
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
2022/04/18 MySQL