python判断任务是CPU密集型还是IO密集型
目前已经知道,在需要并发执行任务的时候,需要使用多线程或者多进程;如果是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密集型的更多相关文章
- python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)
python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...
- Python GIL、CPU密集型、IO密集型
Python GIL(Global Interpreter Lock(全局解释器锁)) 1:进程里面多个线程,线程 共享A=10 2:Python解释器,A改完值之后会传回进程容器,为了防止A和B同时 ...
- CPU密集型和IO密集型(判断最大核心线程的最大线程数)
CPU密集型和IO密集型(判断最大核心线程的最大线程数) CPU密集型 1.CPU密集型获取电脑CPU的最大核数,几核,最大线程数就是几Runtime.getRuntime().availablePr ...
- 什么是CPU密集型、IO密集型?
CPU密集型(CPU-bound) CPU密集型也叫计算密集型,指的是系统的硬盘.内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/ ...
- CPU密集型 VS IO密集型
CPU密集型 CPU密集型也叫计算密集型,指的是系统的硬盘.内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的 ...
- CPU密集型和IO密集型
对于Python如果是CPU密集型应该用多进程模型(大量的计算) 如果是IO密集型应该用多线程模型(数据的读取写入.网络IO数据传输) 由于GIL的存在,CPython不能有效的利用多核处理器,表 ...
- 什么是CPU密集型、IO密集型?(转发)
CPU密集型(CPU-bound) CPU密集型也叫计算密集型,指的是系统的硬盘.内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/ ...
- Java多线程(二)关于多线程的CPU密集型和IO密集型这件事
点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...
- 浅谈Java两种并发类型——计算密集型与IO密集型
转载:https://blog.csdn.net/u013070853/article/details/49304099 核心是可以分别独立运行程序指令的计算单元.线程是操作系统能够进行运算调度的最小 ...
随机推荐
- 评委打分系统最新版,采用Flash展示双屏技术,望大家测试,多提意见.
最新版结合应用了 Flash展示技术,PPT展示技术,移动端云打分技术等. 详细视频见土豆视频:http://www.tudou.com/programs/view/NUN2lUzkPRI 放大查看上 ...
- MyBatis Generator 生成数据库自带中文注释
1. maven依赖 <!-- mybatis生成 jar包 --> <dependency> <groupId>org.mybatis.generator< ...
- mysql千万级数据库插入速度和读取速度的调整记录
一般情况下mysql上百万数据读取和插入更新是没什么问题了,但到了上千万级就会出现很慢,下面我们来看mysql千万级数据库插入速度和读取速度的调整记录吧. 1)提高数据库插入性能中心思想:尽量将数据一 ...
- 『MySQL』时间戳转换
1 NOW() //当前时间 2 SYSDATE() //当前时间 3 CURRENT_TIMESTAMP 4 以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回当前的 ...
- activiti explorer5.22.0源代码解读
请求通过ExplorerApplicationServlet(AbstractApplicationServlet.service()方法)进入web系统中. Activiti Explorer的应用 ...
- python中的open、close、read、write、len、exists
open()打开文件 close()关闭文件 read()读取文件内容 write()写入内容 len()检查文件内容长度 exists()检查文件是否存在 我们举一个例子,将上方的内容全部应用到实际 ...
- python中的extend
extend()拓展列表,批量写入 举个例子: 1 a = ["hello", "world", "dlrb"] 2 b = [1, 2, ...
- spring+mybatis 配置双数据源
配置好后,发现网上已经做好的了, 不过,跟我的稍有不同, 我这里再拿出来现个丑: properties 文件自不必说,关键是这里的xml: <?xml version="1.0&quo ...
- django相关
后台运行django:https://blog.csdn.net/rnger/article/details/79907884 nohup python manage.py runserver 0.0 ...
- kettle实现sqlserver与mysql的连接并写入mysql
1.新建转换databasejoin 2.添加两个db连接 mysql的db连接kettlemysql以及sqlserver2008的db连接kettlesql 前提是在\data-integrati ...