python多进程实例详解
写在前面:python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了非常好用的多进程包multiprocessing,只需要定义一个函数,Python会完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。
1.multiprocessing模块提供了一个Process类来代表一个进程对象
import os
import time
import multiprocessing
def run_proc(name): # 子进程要执行的代码
print '运行子进程 %s ,子进程号为(%s)...' % (name, os.getpid())
print "我的处理内容是:%s+%s=?" % (name,name)
return name if __name__=='__main__':
start = time.time()
print '父进程号为 %s.' % os.getpid()
print('----------------------------------------')
job = []
for i in range():
p = multiprocessing.Process(target=run_proc, args=(i,))#多进程
job.append(p)
print '子进程%d开启...'%i
p.start() #
print '子进程%d结束...' %i
#加join()可以让主线程一直等待全部的子线程结束之后,主线程自身才结束,程序退出
for t in job:
t.join()#join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步
end = time.time()
print end-start
运行结果如下:
父进程号为 4924.
----------------------------------------
子进程0开启...
子进程0结束... 子进程1开启...
子进程1结束... 子进程2开启...
运行子进程 0 ,子进程号为(5516)...
我的处理内容是:0+0=?
运行子进程 1 ,子进程号为(5517)...
我的处理内容是:1+1=?
运行子进程 2 ,子进程号为(5523)...
我的处理内容是:2+2=?
子进程2结束... 0.0220789909363
如果想要返回多进程process处理得到的结果,只需要利用multiprocessing 中的Manager类即可,稍改代码:
import os
import time
from multiprocessing import Manager
def run_proc(name,return_list): # 子进程要执行的代码
print '运行子进程 %s ,子进程号为(%s)...' % (name, os.getpid())
print "我的处理内容是:%s+%s=?" % (name,name)
return_list.append(name) if __name__=='__main__':
print '父进程号为 %s.' % os.getpid()
print('----------------------------------------') manager = Manager()
return_list = manager.list()
#return_dict = manager.dict() 也可以使用字典dict
job = []
for i in range():
p = multiprocessing.Process(target=run_proc, args=(i,return_list))#多进程
job.append(p)
print '子进程%d开启...'%i
p.start()
print '子进程%d结束...' %i
for t in job:
t.join()
print "所有子进程处理得到的结果都在return_list中,值为:",return_list
运行结果如下:
父进程号为 4924.
----------------------------------------
子进程0开启...
子进程0结束... 子进程1开启...
子进程1结束... 子进程2开启...
运行子进程 0 ,子进程号为(5614)...
我的处理内容是:0+0=?
运行子进程 1 ,子进程号为(5616)...
我的处理内容是:1+1=?
运行子进程 2 ,子进程号为(5623)...
我的处理内容是:2+2=?
子进程2结束... 所有子进程处理得到的结果都在return_list中,值为: [0, 1, 2]
2.Pool:如果要启动大量的子进程,可以用进程池的方式批量创建子进程:
from multiprocessing import Pool
import os, time, random def long_time_task(name):
print '运行任务 %s ,子进程号为(%s)...' % (name, os.getpid()) print "我就是子进程号为(%s)处理的内容" % (os.getpid())
start = time.time()
time.sleep(random.random() * )
end = time.time()
print '任务 %s 运行了 %0.2f 秒.' % (name, (end - start))
return name if __name__=='__main__':
print '父进程号为 %s.' % os.getpid()
rst = []
p = Pool() #进程池中含有4个子进程
for i in range(): #4个子进程完成5个任务,所以有一个任务是需要等某个进程空闲再处理
a = p.apply_async(long_time_task, args=(i,)) #a是进程处理函数long_time_task的返回结果
rst.append(a) #将次得到的结果添加到数组rst中去
print '等待所有子进程结束...'
p.close()
p.join()#等待所有子进程执行完毕。调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了。
print '所有子进程结束...'
运行结果如下:
父进程号为 .
运行任务 ,子进程号为()...
运行任务 ,子进程号为()...
运行任务 ,子进程号为()...
我就是子进程号为()处理的内容
我就是子进程号为()处理的内容
运行任务 ,子进程号为()...
我就是子进程号为()处理的内容
我就是子进程号为()处理的内容
任务 运行了 0.16 秒.
运行任务 ,子进程号为()...
我就是子进程号为()处理的内容
等待所有子进程结束...
任务 运行了 0.98 秒.
任务 运行了 0.89 秒.
任务 运行了 2.25 秒.
任务 运行了 2.89 秒.
所有子进程结束...
直接输出rst不会得到想要的结果:
rst
运行结果:
[<multiprocessing.pool.ApplyResult at 0x7ffa6c682c90>,
<multiprocessing.pool.ApplyResult at 0x7ffa6c587590>,
<multiprocessing.pool.ApplyResult at 0x7ffa6c587610>,
<multiprocessing.pool.ApplyResult at 0x7ffa6c5876d0>,
<multiprocessing.pool.ApplyResult at 0x7ffa6c587790>]
这是需要用到.get()方法:
rst = [i.get() for i in rst]
rst
运行结果:
[, , , , ]
python多进程实例详解的更多相关文章
- python自定义异常实例详解
python自定义异常实例详解 本文通过两种方法对Python 自定义异常进行讲解,第一种:创建一个新的exception类来拥有自己的异常,第二种:raise 唯一的一个参数指定了要被抛出的异常 1 ...
- PHP多进程编之pcntl_fork的实例详解
PHP多进程编之pcntl_fork的实例详解 其实PHP是支持并发的,只是平时很少使用而已.平时使用最多的应该是使用PHP-FMP调度php进程了吧. 但是,PHP的使用并不局限于做Web,我们完全 ...
- python中argparse模块用法实例详解
python中argparse模块用法实例详解 这篇文章主要介绍了python中argparse模块用法,以实例形式较为详细的分析了argparse模块解析命令行参数的使用技巧,需要的朋友可以参考下 ...
- python+requests接口自动化测试框架实例详解
python+requests接口自动化测试框架实例详解 转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实 ...
- 【python库模块】Python subprocess模块功能与常见用法实例详解
前言 这篇文章主要介绍了Python subprocess模块功能与常见用法,结合实例形式详细分析了subprocess模块功能.常用函数相关使用技巧. 参考 1. Python subprocess ...
- Python聚类算法之基本K均值实例详解
Python聚类算法之基本K均值实例详解 本文实例讲述了Python聚类算法之基本K均值运算技巧.分享给大家供大家参考,具体如下: 基本K均值 :选择 K 个初始质心,其中 K 是用户指定的参数,即所 ...
- Python编程之列表操作实例详解【创建、使用、更新、删除】
Python编程之列表操作实例详解[创建.使用.更新.删除] 这篇文章主要介绍了Python编程之列表操作,结合实例形式分析了Python列表的创建.使用.更新.删除等实现方法与相关操作技巧,需要的朋 ...
- python 排序算法总结及实例详解
python 排序算法总结及实例详解 这篇文章主要介绍了python排序算法总结及实例详解的相关资料,需要的朋友可以参考下 总结了一下常见集中排序的算法 排序算法总结及实例详解"> 归 ...
- Python开发技术详解(视频+源码+文档)
Python, 是一种面向对象.直译式计算机程序设计语言.Python语法简捷而清晰,具有丰富和强大的类库.它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结 ...
随机推荐
- 服务如何配置JVM
为了使JVM的资源利用更合理,往往需要手动设置JVM的初始值.下面将详细介绍不同环境下的JVM配置. 1.如果是应用程序,则:java -Xms800m -Xmx800m 你的类名 java -Xms ...
- sql server 的模糊查询的用法
查询所有姓张的同学Select * from student where left(sName,1)=‘张‘ 看上去很美,如果改成查询名字中带亮的学生怎么做?换一种做法 like Select ...
- Laravel 中使用 Repository 模式
在本文中,我会向你展示如何在 Laravel 中从头开始实现 repository 设计模式.我将使用 Laravel 5.8.3 版,但 Laravel 版本不是最重要的.在开始写代码之前,你需要了 ...
- 基础 | BIO、NIO与AIO
本文链接:https://blog.csdn.net/bingbeichen/article/details/83617163 Java中的IO部分比较复杂,具体可参看书籍<Java NIO&g ...
- (5)打鸡儿教你Vue.js
条件与循环 条件判断使用 v-if 指令 <p v-if="seen"> <template v-if="ok"> <script ...
- meshing-划分圆柱结构化网格
原视频下载地址:https://yunpan.cn/cqjeckrzEpVkY 访问密码 eb5d
- Java的反射是什么?有什么用?
首先我要简单的来说一下什么是Java的反射机制: 在Java里面一个类有两种状态--编译和运行状态,通常我们需要获取这个类的信息都是在编译阶段获得的,也就是直接点出来或者new出来,可是如果需要在类运 ...
- java基础类型源码解析之String
差点忘了最常用的String类型,我们对String的大多数方法都已经很熟了,这里就挑几个平时不会直接接触的点来解析一下. 先来看看它的成员变量 public final class String { ...
- Python 自学笔记(七)
1.定义函数和调用函数 1-1.定义函数 定义函数的语法书写:def 函数名(参数名)(注:括号内可以为空,也可以为多个参数,多个参数间用逗号隔开即可) 由上可以看出,函数默认返回None 2.函数的 ...
- HBase-集群安装
需要先启动 HDFS 集群和 ZooKeeper 集群. Hadoop 集群安装:https://www.cnblogs.com/jhxxb/p/10629796.html ZooKeeper 集群安 ...