写在前面: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. TOMCAT上传下载文件

    实现下载 修改server.xml修改web.xml   实现上传 实现客户端的上传post请求代码实现 实现服务端的处理   小结         实现下载 实现下载需要  - 修改Tomcat中的 ...

  2. python - Flask 基础(1)

    这两天稍微接触了一点 Flask 框架,所以分享点基础 1. 配置文件 from flask import Flask app = Flask(__name__) # 使用自定义的配置文件 app.c ...

  3. AirtestIde的安装(win10)

    Airtest 是网易出品的一款基于图像识别和poco控件识别的一款UI自动化测试工具. Airtest IDE是这个项目的一个IDE,就像Eclipse.Pycharm一样,是一个集成开发工具. A ...

  4. [Angular 8] Implement a Custom Preloading Strategy with Angular

    Preloading all modules is quite an extreme approach and might not always be desirable. For instance, ...

  5. HTML 005 段落

    HTML 段落 HTML 可以将文档分割为若干段落. HTML 段落 段落是通过 <p> 标签定义的. 实例 <p>这是一个段落 </p> <p>这是另 ...

  6. mysql删除完全重复数据保留一条

    CREATE TABLE tmp AS (SELECT DISTINCT * FROM oa_organization);--将不重复的数据存入新建临时表tmp DELETE FROM oa_orga ...

  7. mysql 的编写顺序和执行顺序

    编写顺序 S..F..W..G..H..O 执行顺序 F..W..G..H..S..O from →join →on →where →group by→having→select→order by→l ...

  8. mvn ssm 异常 org.springframework.beans.factory.BeanCreationException:Error creating bean with name 'multipartResolver'

    解决方案: 添加 commons-fileupload-1.2.jar <!-- https://mvnrepository.com/artifact/commons-fileupload/co ...

  9. 提高十连测day3

    提高十连测day3 A 我们可以枚举两个 $ 1 $ 之间的相隔距离,然后计算形如 $ 00100100 \cdots $ 的串在原串中最⻓⼦序列匹配即可,复杂度 $ O(n^2) $ .寻找 $ S ...

  10. 深入理解JVM虚拟机7:JNDI,OSGI,Tomcat类加载器实现

    打破双亲委派模型 JNDI JNDI 的理解   JNDI是 Java 命名与文件夹接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之中的一 ...