并发在很多有时效性任务的场景中是有很高的要求的,一个好的并发处理策略能够很大程度上缓解系统的压力,提升资源的使用率,程序并发的实现方式主要有两种:多线程并发和多进程并发。在python中由于GIL(全局解释器锁)的存在,导致在同一时刻中只有一个线程能够获取系统的计算资源,所以在python中的线程实际上没有并发的能力,如果想要借助CPU多核的计算能力来进行程序的并发就需要使用到多进程了,在python中多进程已经被封装在multiprocessing模块中了。

今天主要是基于multiprocessing模块来进行一些并发的实践,具体实践内容如下:

#!usr/bin/env python
#encoding:utf-8
from __future__ import division'''
__Author__:沂水寒城
功能: python多进程实践
'''import time
import multiprocessingdef cutList(one_list,c=3):'''将一个长度为n的列表划分 ,每个子列表中包含m个元素'''return [one_list[i:i+c] for i in range(len(one_list)) if i%c==0]def executeFunc(num):'''函数执行体'''res=0for i in range(num):res+=iprint "res: ", resif __name__ == "__main__":num_list=[123,456,78,90,134,1657,12,4324,768,1324,546,23,24243,126,908,323,4356,54678,345,235,897,234786,7786,2389789,234234,436347,231526,12365,64,12351,667,32656832,8908456,4356236]task_list=cutList(num_list,c=4)#异步执行(非阻塞)start=time.time()while task_list:one_task=task_list.pop(0)pool=multiprocessing.Pool(processes=4)for i in range(len(one_task)): pool.apply_async(executeFunc,(one_task[i],))   pool.close()pool.join()   print "Sub-process(es) done."end=time.time()print 'time_consume: ',end-start  print '=*='*30#同步执行(阻塞)start=time.time()while task_list:one_task=task_list.pop(0)pool=multiprocessing.Pool(processes=4)for i in range(len(one_task)): pool.apply(executeFunc,(one_task[i],)) pool.close()pool.join()   print "Sub-process(es) done."end=time.time()print 'time_consume: ',end-start print '=*='*30#异步执行(非阻塞)start=time.time()pool=multiprocessing.Pool(processes=4)for i in range(len(num_list)): pool.apply_async(executeFunc,(num_list[i],))   pool.close()pool.join()   print "Sub-process(es) done."end=time.time()print 'time_consume: ',end-start print '=*='*30

上述运行结果如下:

res:  7503
res:  103740
res:  3003
res:  4005
res:  8911
res:  1371996
res:  66
res:  9346326
res:  294528
res:  875826
res:  148785
res:  253
res:  293849403
res:  7875
res:  411778
res:  52003
res:  9485190
res:  1494814503
res:  59340
res:  27495
res:  401856
res:  27562115505
res:  30307005
res:  2855544537366
res:  27432666261
res:  76440430
res:  26802028575
res:  95199134031
res:  2016
res:  76267425
res:  222111
res:  533234321809696
res:  9488393865730
res:  39680289697740
Sub-process(es) done.
time_consume:  4.99900007248
=*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*=
res:  7503
res:  3003
res:  103740
res:  4005
res:  8911
res:  1371996
res:  66
res:  9346326
res:  294528
res:  875826
res:  148785
res:  253
res:  293849403
res:  7875
res:  411778
res:  52003
res:  9485190
res:  1494814503
res:  59340
res:  27495
res:  401856
res:  27562115505
res:  30307005
res:  2855544537366
res:  95199134031
res:  27432666261
res:  26802028575
res:  76440430
res:  2016
res:  76267425
res:  222111
res:  533234321809696
res:  39680289697740
res:  9488393865730
Sub-process(es) done.
time_consume:  5.2650001049
=*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*=
res:  30307005
res:  2855544537366
res:  95199134031
res:  9488393865730
res:  39680289697740
res:  7503
res:  103740
res:  3003
res:  4005
res:  8911
res:  1371996
res:  66
res:  9346326
res:  294528
res:  875826
res:  148785
res:  253
res:  293849403
res:  7875
res:  411778
res:  52003
res:  9485190
res:  1494814503
res:  59340
res:  27495
res:  401856
res:  27562115505
res:  27432666261
res:  26802028575
res:  76440430
res:  2016
res:  76267425
res:  222111
res:  533234321809696
Sub-process(es) done.
time_consume:  2.91799998283
=*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*=

我们的程序体中计算的是一个累加求和的操作,由于并发性的原因导致结果的顺序不尽相同,这里我们不再关注结果的数值,而是重点关注结果的运行时间。从上述结果中提取出来每种方式执行耗时情况如下:

time_consume:  4.99900007248
time_consume:  5.2650001049
time_consume:  2.91799998283

我们对上述运行时间做一点分析,第一种方式耗时:4.99900007248s,这是采用异步并发执行的方式,是非阻塞的方式,多个进程间并行执行。但是实现划分了子任务,每个子任务结束后下一个子任务才会执行;第二种方式耗时:5.2650001049s,这是采用同步并发执行的方式,是阻塞的,也就是说不同进程间是串行执行的;最后一种方式耗时:2.91799998283,同样是采用异步并发执行的方式,是非阻塞的方式,多个进程间并行执行,不对原始任务进行子任务的划分,一个进程结束后另一个进程自动就会加到当前的进程池中。

对结果分析我们发现:第二种方式耗时>第一种方式耗时>第三种方式耗时,这其实也对应了我们上段的分析,同步执行方式最慢,因为是串行执行的;第一种异步方式由于划分了子任务,单个子任务内并发执行,不同子任务间串行执行,这个时间取决于子任务内最晚执行结束的任务单元的耗时;第三种方式直接对原始任务进行并发处理,耗时最短,不同任务间都是并发执行的。

python多进程调度模块multiprocessing实践实践相关推荐

  1. python php multiprocessing,Python多进程并发(multiprocessing)用法实例详解

    本文实例讲述了Python多进程并发(multiprocessing)用法.分享给大家供大家参考.具体分析如下: 由于Python设计的限制(我说的是咱们常用的CPython).最多只能用满1个CPU ...

  2. 【python第三方库】python多进程编程multiprocessing库和subprocess库的区别与使用

    多进程,多线程介绍请阅读blog python多线程编程请阅读blog 文章目录 一.mutiprocessing库与subprocess库的区别 二.multiprocessing使用介绍 1. 创 ...

  3. python多进程详解

    目录 python多进程 序.multiprocessing 一.Process process介绍 例1.1:创建函数并将其作为单个进程 例1.2:创建函数并将其作为多个进程 例1.3:将进程定义为 ...

  4. Python 多进程开发与多线程开发

    我们先来了解什么是进程? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本:进程 ...

  5. Python 多进程并行编程实践: multiprocessing 模块

    转载:http://python.jobbole.com/87645/ 前言 并行计算是使用并行计算机来减少单个计算问题所需要的时间,我们可以通过利用编程语言显式的说明计算中的不同部分如何再不同的处理 ...

  6. 计算机python程序设计导论,程序设计导论:Python计算与应用开发实践(原书第2版)...

    程序设计导论:Python计算与应用开发实践(原书第2版) 语音 编辑 锁定 讨论 上传视频 <程序设计导论:Python计算与应用开发实践(原书第2版)>是2018年机械工业出版社出版的 ...

  7. python从入门到实践源代码-Python从入门到项目实践 PDF 全彩带源码版

    给大家带来的一篇关于Python相关的电子书资源,介绍了关于Python.入门.项目实践方面的内容,本书是由吉林大学出版社出版,格式为PDF,资源大小2.1 GB,admin编写,目前豆瓣.亚马逊.当 ...

  8. python项目实例源码哪里下载-Python从入门到项目实践 PDF 全彩带源码版

    给大家带来的一篇关于Python相关的电子书资源,介绍了关于Python.入门.项目实践方面的内容,本书是由吉林大学出版社出版,格式为PDF,资源大小2.1 GB,admin编写,目前豆瓣.亚马逊.当 ...

  9. python编程入门指南 明日科技-python从入门到项目实践明日科技三剑客书籍视频...

    ┃ code(实例源码) ┃ ┃ 03.rar ┃ ┃ 04.rar ┃ ┃ 05.rar ┃ ┃ 06.rar ┃ ┃ 07.rar ┃ ┃ 08.rar ┃ ┃ 09.rar ┃ ┃ 10.rar ...

  10. python编程 从入门到实践怎么样-python编程从入门到实践这本书怎么样

    <Python编程-从入门到实践>作者: Eric Matthes,已翻译为中文,人民邮电出版社出版. python编程从入门到实践怎么样? 我们一起看看已经学习的同学对这本书的口碑和评价 ...

最新文章

  1. 解决Maven项目pom.xml文件报xxx\target\classes\META-INF\MANIFEST.MF (系统找不到指定的路径。)问题...
  2. 【黑马程序员 C++教程从0到1入门编程】【笔记4】C++核心编程(类和对象——封装、权限、对象的初始化和清理、构造函数、析构函数、深拷贝、浅拷贝、初始化列表、友元friend、运算符重载)
  3. NOIP信息奥赛--1995“同创杯”初中复赛题题解(一)
  4. 『设计模式』大话西游的移魂大法竟移出来了桥接模式
  5. python flask 上传下载 api_python – 使用Flask上传和下载文件
  6. python各种包安装顺序_史上最全的Python包管理工具:Anaconda教程
  7. asp.net电子商务开发实战 视频 第二讲 (下)
  8. linux驱动编写(platform总线和网卡驱动)
  9. zabbix源码编译安装以及添加第一台host监控
  10. 按值传递和按引用传递的区别_c++按值、地址、引用传递参数
  11. CSS定位规则之BFC
  12. 新手指引,php什么是常量、变量、数组、类和对象及方法?
  13. oracle 级联外键约束,Oracle 外键的相关约束中级联删除的方案
  14. 最新投影圣经投影赞美诗歌圣经诗歌2020
  15. 欢迎空心字怎么写_春节快乐空心字怎么写
  16. miflash刷机:fastboot模式/保留数据刷机
  17. 为什么博士后的年薪远远高于刚入职的大学老师?
  18. 启发式算法greedy heuristic、贪心算法
  19. 杭电HDU 1004 Let the Balloon Rise AC代码 简单题
  20. 计算机网络原理 - 概述

热门文章

  1. ubuntu14下搭建ssdb主从环境
  2. [MSN谈话]专注、口碑和猎头
  3. 听说你在学Python?来点PEP吧
  4. 黑马程序员_MapK,V 映射关系 Map.Entry
  5. C++程序设计-第十周循环结构程序设计上机实践项目
  6. Winsock传输数据
  7. 数据库连接报错2013-lost connection to mysql server at ‘reading initial communication packet’ system error:0
  8. Unity中一个安卓设备拆装项目,从使用到放弃ab包过程记录
  9. 算法设计——极大极小搜索
  10. VC 2010下安装OpenCV2.4.4(来自wiki)