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中的lstrip()方法使用简介
May 19 Python
Python反转序列的方法实例分析
Mar 21 Python
python计算列表内各元素的个数实例
Jun 29 Python
python实现C4.5决策树算法
Aug 29 Python
python 判断参数为Nonetype类型或空的实例
Oct 30 Python
Python http接口自动化测试框架实现方法示例
Dec 06 Python
PyQt5+requests实现车票查询工具
Jan 21 Python
对pandas通过索引提取dataframe的行方法详解
Feb 01 Python
Python定时任务工具之APScheduler使用方式
Jul 24 Python
python flask几分钟实现web服务的例子
Jul 26 Python
python编写一个会算账的脚本的示例代码
Jun 02 Python
Pygame游戏开发之太空射击实战敌人精灵篇
Aug 05 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
Search Engine Friendly的URL设计
2006/10/09 PHP
PHP个人网站架设连环讲(一)
2006/10/09 PHP
php 图像函数大举例(非原创)
2009/06/20 PHP
PHP加Nginx实现动态裁剪图片方案
2014/03/10 PHP
mysql_escape_string()函数用法分析
2016/04/25 PHP
支付宝服务窗API接口开发php版本
2016/07/20 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
2017/01/12 PHP
Thinkphp5+uploadify实现的文件上传功能示例
2018/05/26 PHP
javascript 对象比较实现代码
2009/04/27 Javascript
jquery $(document).ready() 与window.onload的区别
2009/12/28 Javascript
使用闭包对setTimeout进行简单封装避免出错
2013/07/10 Javascript
微信开发 js实现tabs选项卡效果
2016/10/28 Javascript
微信小程序-拍照或选择图片并上传文件
2017/01/06 Javascript
微信小程序 页面传值详解
2017/03/10 Javascript
JS实现复选框的全选和批量删除功能
2017/04/05 Javascript
JS实现留言板功能
2017/06/17 Javascript
利用express启动一个server服务的方法
2017/09/17 Javascript
微信小程序实现tab切换效果
2017/11/21 Javascript
如何使用VuePress搭建一个类型element ui文档
2019/02/14 Javascript
手把手带你封装一个vue component第三方库
2019/02/14 Javascript
记录一次开发微信网页分享的步骤
2019/05/07 Javascript
python实现kNN算法
2017/12/20 Python
Numpy数组转置的两种实现方法
2018/04/17 Python
python3实现二叉树的遍历与递归算法解析(小结)
2019/07/03 Python
python在openstreetmap地图上绘制路线图的实现
2019/07/11 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
Python字符串及文本模式方法详解
2020/09/10 Python
Python importlib模块重载使用方法详解
2020/10/13 Python
Python关于拓扑排序知识点讲解
2021/01/04 Python
python sleep和wait对比总结
2021/02/03 Python
Sofmap官网:日本著名的数码电器专卖店
2017/05/19 全球购物
瑞士图书网站:Weltbild.ch
2019/09/17 全球购物
同步和异步有何异同,在什么情况下分别使用他们?举例说明
2014/02/27 面试题
销售口号大全
2014/06/11 职场文书
群众路线问题查摆对照检查材料
2014/10/04 职场文书
java高级用法JNA强大的Memory和Pointer
2022/04/19 Java/Android