写在前面: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
print
#加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
print
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多进程实例详解的更多相关文章

  1. python自定义异常实例详解

    python自定义异常实例详解 本文通过两种方法对Python 自定义异常进行讲解,第一种:创建一个新的exception类来拥有自己的异常,第二种:raise 唯一的一个参数指定了要被抛出的异常 1 ...

  2. PHP多进程编之pcntl_fork的实例详解

    PHP多进程编之pcntl_fork的实例详解 其实PHP是支持并发的,只是平时很少使用而已.平时使用最多的应该是使用PHP-FMP调度php进程了吧. 但是,PHP的使用并不局限于做Web,我们完全 ...

  3. python中argparse模块用法实例详解

    python中argparse模块用法实例详解 这篇文章主要介绍了python中argparse模块用法,以实例形式较为详细的分析了argparse模块解析命令行参数的使用技巧,需要的朋友可以参考下 ...

  4. python+requests接口自动化测试框架实例详解

    python+requests接口自动化测试框架实例详解   转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实 ...

  5. 【python库模块】Python subprocess模块功能与常见用法实例详解

    前言 这篇文章主要介绍了Python subprocess模块功能与常见用法,结合实例形式详细分析了subprocess模块功能.常用函数相关使用技巧. 参考 1. Python subprocess ...

  6. Python聚类算法之基本K均值实例详解

    Python聚类算法之基本K均值实例详解 本文实例讲述了Python聚类算法之基本K均值运算技巧.分享给大家供大家参考,具体如下: 基本K均值 :选择 K 个初始质心,其中 K 是用户指定的参数,即所 ...

  7. Python编程之列表操作实例详解【创建、使用、更新、删除】

    Python编程之列表操作实例详解[创建.使用.更新.删除] 这篇文章主要介绍了Python编程之列表操作,结合实例形式分析了Python列表的创建.使用.更新.删除等实现方法与相关操作技巧,需要的朋 ...

  8. python 排序算法总结及实例详解

    python 排序算法总结及实例详解 这篇文章主要介绍了python排序算法总结及实例详解的相关资料,需要的朋友可以参考下 总结了一下常见集中排序的算法 排序算法总结及实例详解"> 归 ...

  9. Python开发技术详解(视频+源码+文档)

    Python, 是一种面向对象.直译式计算机程序设计语言.Python语法简捷而清晰,具有丰富和强大的类库.它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结 ...

随机推荐

  1. ORM补充

  2. sql server update....set.... from ....where....

    工作中遇到的  update 的更新方法 以前update 表 set 列 = 新值     稍稍进阶    update 表 set 列 = (select  值 from 表 where ...) ...

  3. Laradock Laravel database connection refused

    Laradock Laravel database connection refused SHARE  Laradock is a PHP development environment which ...

  4. soap1.1与soap1.2

    1.soap1.2 如果加上jar包后,项目启动报错,有可能是jar包没起作用, 解决方法:把jar包移除,重新加入jar包 TCP/IP Monitor监测到的内容: soap1.2请求与soap1 ...

  5. WINDOWS 10下64位本地 ORACLE 11 G安装完整教程

    URL:https://www.cnblogs.com/count-mjb/p/7655592.html wssbht = (DESCRIPTION = (ADDRESS_LIST = (ADDRES ...

  6. 如何用 ISO 镜像制作 U 盘安装盘(通用方法、无需 WinPE)

    今天聊的这个话题属于老生常谈,这几年时常有读者来询问(现在有越来越多的电脑是无光驱的).再加上俺后面要扫盲一些“特殊的 Linux 发行版”,到时候肯定又要涉及到制作可引导U盘的事情.所以,今天先单独 ...

  7. Linux使用Aria2命令下载BT种子/磁力/直链文件 转载

    Linux使用Aria2命令下载BT种子/磁力/直链文件 博主: Rat's 发布时间:2017 年 10 月 10 日 26725 次浏览 8 条评论 1073 字数 分类:主机教程 首页 正文 分 ...

  8. Luogu5071 [Ynoi2015]此时此刻的光辉 【莫队】

    题目链接:洛谷 这个跟上上个Ynoi题目是一样的套路,首先我们知道\(n=\prod p_i^{\alpha_i}\)时\(d(n)=\prod (\alpha_i+1)\). 首先对所有数分解质因数 ...

  9. P1850 换教室——期望DP

    题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n2n 节课程安排在 nnn 个时间段上.在第 iii(1≤i≤n1 \leq i ...

  10. dubbo+zookeeper示例记录

    提示:要直接看搭建例子的可以跳到 三 一.项目架构的发展 传统的mvc架构项目将整个系统功能实现全部写在一个项目中,部署在一个机器上,随着用户量的增涨,单个项目服务器无法承受暴增的用户请求时需要增加服 ...