目前已经知道,在需要并发执行任务的时候,需要使用多线程或者多进程;如果是IO密集型任务,使用多线程,如果是CPU密集型任务,使用多进程;但问题是,经常我们会遇到一种情况就是:需要被执行的任务既有IO操作,又有计算操作,那么这种情况下,已经无法 直观的判断任务是IO操作的多还是计算操作的多了;

所以,在开始并发任务之前,可以先进行测试,看看是使用多线程还是多进程所用的时间少,那个少就用那个

python 多进程模块multiprocessing,提供了多进程的进程池和多线程的线程池,辅助我们进行测试,如下:

from multiprocessing import Pool
from multiprocessing.dummy import Pool as ThreadPool

其中第一个pool是多进程的进程池,第二个是线程池,如果查看dummy的源码,可以看到dummy继承自Threading.thread

class DummyProcess(threading.Thread):

    def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):
threading.Thread.__init__(self, group, target, name, args, kwargs)
self._pid = None
self._children = weakref.WeakKeyDictionary()
self._start_called = False
self._parent = current_process()

multiprocessing.dummy实际上调用的是多线程的模块,是对多线程模块的进一步封装,使得其和多进程的具有相同的API;

介绍完了模块,我们使用实际的例子来测试任务:

任务:使用urllib请求多个url,并计算返回的字符串的长度;

  分别使用多进程和多线程去执行该任务

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
__author__ = 'Charles Chang' from multiprocessing import Pool
from multiprocessing.dummy import Pool as ThreadPool
from multiprocessing import freeze_support import urllib2 urls = [
'http://www.python.org',
'http://www.python.org/about/',
'http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html',
'http://www.python.org/doc/',
'http://www.python.org/download/',
'http://www.python.org/getit/',
'http://www.python.org/community/',
'https://wiki.python.org/moin/',
'http://planet.python.org/',
'https://wiki.python.org/moin/LocalUserGroups',
'http://www.python.org/psf/',
'http://docs.python.org/devguide/',
'http://www.python.org/community/awards/'
] import time def w1(func):
def inner(*args,**kwargs):
past = time.time()
func(*args,**kwargs)
now = time.time()
cost_time = now - past
print "The function <%s> cost time: <%s>"%(func.func_name,cost_time)
return inner def test(n):
print len(urllib2.urlopen(n).read()) ppool = Pool(4)
@w1
def MulProcess():
for n in urls:
ppool.apply(func=test,args=(n,))
ppool.close()
ppool.join()
MulProcess()
tpool = ThreadPool(4)
@w1
def MulThreading():
for n in urls:
tpool.apply(func=test,args=(n,))
tpool.close()
tpool.join()
MulThreading()

运行结果:

[root@linux-node1 ~]# python m1.py
47436
40307
34778
38780
94856
94767
33406
22916
277026
108358
42671
66493
32669
The function <MulProcess> cost time: <55.7311470509>
47436
40307
34778
38780
94856
94767
33406
22916
277026
108358
42671
66493
32669
The function <MulThreading> cost time: <93.1050798893>

可以看到:使用多进程耗时短

参考链接:http://chriskiehl.com/article/parallelism-in-one-line/

  

python判断任务是CPU密集型还是IO密集型的更多相关文章

  1. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...

  2. Python GIL、CPU密集型、IO密集型

    Python GIL(Global Interpreter Lock(全局解释器锁)) 1:进程里面多个线程,线程 共享A=10 2:Python解释器,A改完值之后会传回进程容器,为了防止A和B同时 ...

  3. CPU密集型和IO密集型(判断最大核心线程的最大线程数)

    CPU密集型和IO密集型(判断最大核心线程的最大线程数) CPU密集型 1.CPU密集型获取电脑CPU的最大核数,几核,最大线程数就是几Runtime.getRuntime().availablePr ...

  4. 什么是CPU密集型、IO密集型?

    CPU密集型(CPU-bound) CPU密集型也叫计算密集型,指的是系统的硬盘.内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/ ...

  5. CPU密集型 VS IO密集型

    CPU密集型 CPU密集型也叫计算密集型,指的是系统的硬盘.内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的 ...

  6. CPU密集型和IO密集型

    对于Python如果是CPU密集型应该用多进程模型(大量的计算)   如果是IO密集型应该用多线程模型(数据的读取写入.网络IO数据传输) 由于GIL的存在,CPython不能有效的利用多核处理器,表 ...

  7. 什么是CPU密集型、IO密集型?(转发)

    CPU密集型(CPU-bound) CPU密集型也叫计算密集型,指的是系统的硬盘.内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/ ...

  8. Java多线程(二)关于多线程的CPU密集型和IO密集型这件事

    点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...

  9. 浅谈Java两种并发类型——计算密集型与IO密集型

    转载:https://blog.csdn.net/u013070853/article/details/49304099 核心是可以分别独立运行程序指令的计算单元.线程是操作系统能够进行运算调度的最小 ...

随机推荐

  1. jscs sublime 插件配置 .jscsrc 文件

    { "disallowEmptyBlocks": true, "disallowKeywordsOnNewLine": ["else", & ...

  2. 使用bootstrap3.0搭建一个具有自定义风格的侧边导航栏

    由于工作变动,新的项目组,可能会涉及到更多的类似于后台管理系统这一类的项目,而且开发可能更加偏向于传统型的开发,希望今后能够在新的项目中能够用得上vuejs吧! 接手项目的时候,就是一个后台管理系统, ...

  3. 性能测试day02_预习知识

    在进入第二天的学习之前,我想我们需要提前先了解一下基础的知识,所以这一篇主要讲解的就是预习课程,关于协议和抓包的讲解(原理和工具). 可以说基于服务器的性能一般都是基于协议的,所以我们就需要懂协议,以 ...

  4. 【Selenium-WebDriver问题篇】Selenium实现元素的拖拽(java版)(转)

    https://blog.csdn.net/u010503127/article/details/51381284 Selenium实现元素的拖拽(java版) [前言] 自从淘宝网登陆页出现滑块验证 ...

  5. SAP HANA HDBSQL命令

    1.登录: window操作系统下面: 打开C:\Program Files\SAP\hdbclient\hdbsql.exe \c 连接数据库  connect的缩写 HANA hostname:  ...

  6. SDE在64位Server2008下Post启动服务失败官方解释

    解决了一个SDE启动问题,在此记录一下 在server 2008 64位下安装完arcgis sde之后,Post启动服务,总是失败 查看SDE日志(etc目录下) DB_open_instance( ...

  7. jQuery 移除事件与模拟事件

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  8. oracle PL/SQL的介绍

    转自:http://blog.sina.com.cn/s/blog_4c302f060101i4o1.html 一 PL/SQL的介绍 1 PL/SQL是什么? PL/SQL(procedural l ...

  9. nginx 代理跨域

    跨域 nginx设置http{ add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers X- ...

  10. awk的用法

    awk是什么 awk是一种优良的文本处理工具,同时也是一种脚本语言.awk的三位作者者已将它正式定义为“样式扫描和处理语言”.awk脚本允许您创建简短的程序,这些程序读取输入文件.为数据排序.处理数据 ...