如何使用scala future async以及它如何与nodejs相关的async异步

时间:2014-08-22 18:35:03

标签: multithreading scala asynchronous akka future

我对scala未来及其运作方式有很多怀疑,基本上我正在阅读这篇关于scala async使用期货的文章

Play Framework:没有线程池和回调地狱的异步I / O http://engineering.linkedin.com/play/play-framework-async-io-without-thread-pool-and-callback-hell

作者谈到使用线程池处理异步编程有多难...并解释了scala中async future的工作方式,但本文为我提出了更多问题:

我认为scala async使用线程池工作,它是否与nodejs的工作方式相似,是否异步同步?

我做了一个小测试,构建了一个缓慢的服务器,在响应之前等待1秒钟。然后(使用scala版本2.11.0-M5和来自scala.concurrent._的未来)我向服务器发出了100个请求

结果很明显,完成所有请求需要花费100多秒... 现在是异步代码

        implicit val executorService = Executors.newFixedThreadPool(8) //I also test without fixing the thread pool 

        implicit val executionContext = ExecutionContext.fromExecutorService(executorService)
              val myFuture = future{
                    blocking{
                    .  ..long request here

              })}
              }

       myFuture.onComplete{
                    case Success(_) => ....
                    case _ => ....
              }

我理解的是,如果我不在我的executorService中修复我的线程池,scala基于我的pc有多少核心定义了多少线程必须采取...

运行这个......完整的测试采用了" 100/8"秒aprox,是好的,但不是我所期望的一个事件系统,似乎更多与我的线程阻塞的线程池有关,是否可以?..你会期待什么?

阻止并没有避免我的代码块,我也不知道原因..

到目前为止,我的问题是:

1)如果我只用一个线程运行scala期货会发生什么? ..会期望与nodejs类似的行为,它运行在一个线程中并且是异步的同步吗?...虚拟测试scala异步比例基于我之前定义的线程数(所以基本上它不会避免线程池地狱)

2)来自Heather Miller的回答

Asynchronous IO in Scala with futures

她给人的印象比我内部阻挡代码的时候,scala产生了一个阻止饥饿的新工人,但是在我的例子中似乎没有按预期工作,我的代码最终阻止了,我做错了什么?...

3)为什么我的代码阻止的原因是什么?...在​​使用promises /期货时我是否应该知道一些规则?

4) scala期货,akka期货和Twitter期货有什么区别? ..根据我选择的工具,我可以得到完全不同的结果吗?...

注意:我修复了线程池,因为我在单核架构(vertx.io)中运行示例..没有它我没有得到结果(scala只采用了一个线程而且它在每个请求中阻止)

注意2 我对线程执行并不熟悉,可能我在术语上犯了几个错误而不是我用过......

0 个答案:

没有答案