社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
前一篇文章Java中的纤程库 – Quasar中我做了简单的介绍,现在进一步介绍这个纤程库。
Quasar还没有得到广泛的应用,搜寻整个github也就pinterest/quasar-thrift这么一个像样的使用Quasar的库,并且官方的文档也很简陋,很多地方并没有详细的介绍,和Maven的集成也不是很好。这些都限制了Quasar的进一步发展。
但是,作为目前最好用的Java coroutine的实现,它在某些情况下的性能还是表现相当出色的,希望这个项目能够得到更大的支持和快速发展。
因为Quasar文档的缺乏,所以使用起来需要不断的摸索和在论坛上搜索答案,本文将一些记录了我在Quasar使用过程中的一些探索。
虽然Java的线程的API封装的很好,使用起来非常的方便,但是使用起来也得小心。首先线程需要耗费资源,所以单个的机器上创建上万个线程很困难,其次线程之间的切换也需要耗费CPU,在线程非常多的情况下导致很多CPU资源耗费在线程切换上,通过提高线程数来提高系统的性能有时候适得其反。你可以看到现在一些优秀的框架如Netty都不会创建很多的线程,默认2倍的CPU core的线程数就已经应付的很好了,比如node.js可以使用单一的进程/线程应付高并发。
纤程使用的资源更少,它主要保存栈信息,所以一个系统中可以创建上万的纤程Fiber,而实际的纤程调度器只需要几个Java线程即可。
我们看一个性能的比较,直观的感受一下Quasar带来的吞吐率的提高。
下面这个例子中方法m1
调用m2
,m2
调用m3
,但是m2
会暂停1秒钟,用来模拟实际产品中的阻塞,m3
执行了一个简单的计算。
通过线程和纤程两种方式我们看看系统的吞吐率(throughput)和延迟(latency)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | public class Helloworld { @Suspendable static void m1() throws InterruptedException, SuspendExecution { String m = "m1" ; //System.out.println("m1 begin"); m = m2(); //System.out.println("m1 end"); //System.out.println(m); } static String m2() throws SuspendExecution, InterruptedException { String m = m3(); Strand.sleep( 1000 ); return m; } //or define in META-INF/suspendables @Suspendable static String m3() { List l = Stream.of( 1 , 2 , 3 ).filter(i -> i% 2 == 0 ).collect(Collectors.toList()); return l.toString(); } static public void main(String[] args) throws ExecutionException, InterruptedException { int count = 10000 ; testThreadpool(count); testFiber(count); } static void testThreadpool( int count) throws InterruptedException { final CountDownLatch latch =
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 你可能感兴趣的文章
精选的优质文章
0 条评论
请先 登录 后评论
官方社群GO教程
推荐文章猜你喜欢发送私信如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作! |