/**
* 多线程方式测试
* 检查多线程读取是否可以节省时间
*/
@SuppressWarnings("unchecked")
public static void main(String[] args){
try{
//线程池大小
int poolSize = 20;
long startIndex = 0;//开始位置
int batchSize = 1024*1024*3;//读大小,或缓存大小
long total =new File("E:/Tool/CentOS.5.6.iso").length();
System.out.println(total);
//线程池
ExecutorService executorService = Executors.newFixedThreadPool(poolSize);
LinkedList<Future> queue = new LinkedList<Future>();
long start =System.currentTimeMillis();
while(startIndex <= total){
FileInputStream fis = new FileInputStream(new File("E:/Tool/CentOS.5.6.iso"));
queue.add(executorService.submit(new ThreadTask(startIndex,batchSize,fis)));
startIndex += batchSize;
}
//关闭线程池
executorService.shutdown();
while(!queue.isEmpty()){
try {
queue.pop().get();
} catch (Exception e) {
System.out.println("+异常 ");
}
}
long end =System.currentTimeMillis();
System.out.println("耗时:"+String.valueOf(end-start));
System.out.println("读了:"+ThreadTask.bbb.toString());
}catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 线程任务
*
*/
class ThreadTask implements Runnable{
private FileInputStream fis;
private long startIndex;
private int batchSize;
public static AtomicLong bbb = new AtomicLong(0);
public ThreadTask(long startIndex,int batchSize,FileInputStream fis){
this.startIndex=startIndex;
this.fis=fis;
this.batchSize=batchSize;
}
@Override
public void run() {
try {
//System.out.println(Thread.currentThread().getName()+" 开始");
fis.skip(startIndex);
byte[] b = new byte[batchSize];//缓冲大小
int flag = fis.read(b);
if(flag != -1){
bbb.addAndGet(flag);
}
fis.close();
//System.out.println(Thread.currentThread().getName()+" 结束");
} catch (Exception e) {
e.printStackTrace();
}
}
测试结果:
电脑:华硕N56V
cpu:intel core i5
硬盘:750GB
单线程
时间 大小
42900 4262373376
40545
43477
41259
40810
40591
多线程
时间 线程大小 大小
41855 2 4262373376
41278
42853
42619
45071
43742
43025 3 4262373376
42978
44616
45128
43685
46785
42370 4 4262373376
41371 4
41496
42665
40403
42369
42370 5 4262373376
53539
40373
41215
44678 10 4262373376
43400 10
46768 20 4262373376
48204 20
分享到:
相关推荐
Python 界有条不成文的准则: 计算密集型任务适合多进程,IO 密集型任务适合多线程。本篇来作个比较。 通常来说多线程相对于多进程有优势,因为创建一个进程开销比较大,然而因为在 python 中有 GIL 这把大锁的存在...
Python的多线程不适合CPU密集操作型的任务,适合io密集操作型的任务,例如:SocketServer 如果现在再有CPU密集操作型的任务,那该怎么办呢? 首先说,多进程的进程之间是独立的,然后注意了,python的线程用的是系统...
为什么python多线程在面对IO密集型任务的时候会产生加速作用? 为什么python多线程在面对CPU计算密集型任务的时候不仅起不到加速作用,反而加长了计算时间? 相关传送门: 进程,线程,协程关系:...
在为什么要使用多线程方面,我们将探讨多线程的应用场景和意义,比如在计算密集型操作和IO密集型操作中的使用优势等。如IO密集型操作特点,通常会有大量的等待时间,我们可以采用多线程实现各任务之间的并行处理,...
本文实例讲述了Python多线程Threading、... 对于IO密集型的程序来说,多线程可以利用读IO的时间去做其他事【IO并不占用CPU,这就好像A买个一份外卖,他只需要等着送过来然后敲A家的门就行了】; 而对于CPU密集型的程
python的多进程性能要明显优于多线程,因为cpython的GIL对性能做了约束。...如果是IO密集型,多线程进程可以利用IO阻塞等待时的空闲时间执行其他线程,提升效率。所以我们根据实验对比不同场景的效率 操作系统 C
Python是运行在解释器中...如果是IO密集型,多线程进程可以利用IO阻塞等待时的空闲时间执行其他线程,提升效率。所以我们根据实验对比不同场景的效率 操作系统 CPU 内存 硬盘 Windows 10 双核 8GB 机械硬盘 (1)引入
任务一般可分为:CPU密集型,IO密集型,混合型,对于不同类型的任务需要分配不同大小的线程池。 CPU密集型任务 尽量使用较小的线程池,一般为CPU核心数+1 。因为CPU密集型任务具有CPU使用率高,若开过多的线程数,...
Web 应用大多是 IO 密集型的,利用 Ruby 多进程+多线程模型将能大幅提升系统吞吐量。其原因在于:当Ruby 某个线程处于 IO Block 状态时,其它的线程还可以继续执行。但由于存在 Ruby GIL (Global Interpreter Lock)...
Python支持的并发分为多线程并发与多进程并发(异步IO本文不涉及)。概念上来说,多进程并发即运行多个独立的程序,优势在于并发处理的任务都由操作系统管理,不足之处在于程序与各进程之间的通信和数据共享不方便;...
一、python多线程 因为CPython的实现使用了Global ...但是如果你的程序是IO密集型,则使用线程仍然是很好的选择。 二、python多线程使用的两种方法 实例: 复制代码 代码如下: import threading import time def wo
在这个过程中cpu无疑是处于等待io的空闲状态的,这样既浪费了cpu资源,又花费了大量时间(当然这里主要说多线程,批量查询不在考虑范围,总会存在不能批量查询的情况),在这种非密集型运算(及大量占用cpu资源)的...
Python由于有全锁局的存在,并不能利用多核优势。所以,如果你的多线程进程是CPU密集型的,那多线程并不能带来效率上的提升,...如果是IO密集型,多线程进程可以利用IO阻塞等待时的空闲时间执行其他线程,提升效率。
千行代码入门Python ...Python进阶聊聊IO密集型任务、计算密集型任务,以及多线程、多进程 Python3.6正式版要来了,你期待哪些新特性? Python进阶实例讲解Python中的魔法函数(MagicMethods) Flask的web快速开发教程
python多线程适合IO密集型场景,而在CPU密集型场景,并不能充分利用多核CPU,而协程本质基于线程,同样不能充分发挥多核的优势。 针对计算密集型场景需要使用多进程,python的multiprocessing与threading模块非常...
IO密集型:CPU经常等待IO 网络后台服务 网络爬虫 多协程 多线程 CPU密集型:计算密集型,CPU计算为主 加密解密使用多进程 全局解释器锁GIL 即使使用了多线程,同一时刻也只有多个线程使用CPU,导致多核CPU的浪费 GIL...
使用多线程,进程以及协程实现的任务执行器,加快任务执行(针对IO密集型任务) description 1.Eventor类,初始化参数如下: threadcount: 开启多少个线程 taskunitcount: 每个线程处理多少任务 func: 实际的处理任务的...
正确使用异步编程能够使用尽可能少的线程来执行大量的IO密集型操作。可惜的是,即时异步编程有避免线程阻塞等诸多好处,但是这种编程方式至今没有被大量采用。其原因有很多,其中最主要的一点可能就是异步模型在编程...
gevent实现协程,gevent是通过阻塞代码(例如网络延迟等)来自动切换要执行的任务,所以在进行IO密集型程序时(例如爬虫),使用gevent可以提高效率(有效利用网络延迟的时间去执行其他任务)。 GIL(全局解释器锁)是C语言...