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++)轻松地联结 ...
随机推荐
- 包,logging日志模块,copy深浅拷贝
一 包 package 包就是一个包含了 __init__.py文件的文件夹 包是模块的一种表现形式,包即模块 首次导入包: 先创建一个执行文件的名称空间 1.创建包下面的__init__.py文件的 ...
- sql server 将某一列的值拼成一个字符串 赋值到一个字段内
DECLARE @refCodeitems VARCHAR(800), SELECT @refCodeitems=ISNULL(@refCodeitems,'')+refCodeitem +'/' ...
- Jedis常用方法API
一.键操作 二.字符串操作 三.整数和浮点数操作 四.列表(List)操作 五.集合(Set)操作 六.哈希(Hash)操作 七.有序集合(Zsort)操作 八.排序操作
- msf爆破
SSH服务口令猜解: msf > use auxiliary/scanner/ssh/ssh_loginmsf auxiliary(ssh_login) > show optionsmsf ...
- mongodb 4.0.5 集群搭建五台集群
配置文件采用yaml方式来配置 生产中取消了仲裁者的角色,因为仲裁者也不会存储数据,只是起到选举的作用,线上为了保证数据安全,每份数据都会配置两个副本集,也就是每份数据存储了三份. 优化配置,采用五台 ...
- openssl使用以及C#加密和数字签名
如何使用openssl生成RSA公钥和私钥对 http://blog.csdn.net/scape1989/article/details/18959657 https://www.openssl ...
- 如何安全的从LVM中移除磁盘
学习如何安全的从LVM中移除磁盘,当磁盘卷中有磁盘出现问题或是想把磁盘卷中的磁盘重新使用时就显得十分有用.本教程将重点关注以下问题: 如何安全的从LVM中移除磁盘 如何联机从VG中移除磁盘 如 ...
- 欢迎使用CSDN的markdown编辑器
以下是蒻鞫第一次打开CSDN-markdown编译器的温馨提示,感觉CSDN好贴心,不作任何用途,仅为纪念,若存在违法侵权行为,请联系留言,立即删除. List item 这里写 欢迎使用Markdo ...
- 传统PC机I/O位址空间范围
空间范围是0x000--0x3FF,有1024个I/O端口位址可供使用! 使用EISA或PCI等汇流排结构的现代PC机,有64KB的I/O位址空间可供使用.在普通Linux系统下透过查看/proc/i ...
- java实例化对象的过程
总结以上内容,可以得到对象初始化过程: 1. 如果存在继承关系,就先父类后子类: 2 .如果在类内有静态变量和静态块,就先静态后非静态,最后才是构造函数: 3 .继承关系中,必须要父类初始化完成 ...