小编xie*_*fei的帖子

scala.concurrent.Promise有什么用例?

我正在阅读SIP-14,它的概念Future非常有意义且易于理解.但有两个问题Promise:

  1. SIP说Depending on the implementation, it may be the case that p.future == p.怎么会这样?是FuturePromise不是两种不同的类型?

  2. 我们Promise什么时候应该使用?示例producer and consumer代码:

    import scala.concurrent.{ future, promise }
    val p = promise[T]
    val f = p.future
    
    val producer = future {
        val r = produceSomething()
        p success r
        continueDoingSomethingUnrelated()
    }
    val consumer = future {
        startDoingSomething()
        f onSuccess {
            case r => doSomethingWithResult()
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

很容易阅读,但我们真的需要这样写吗?我试图只用Future和没有Promise来实现它:

val f = future …
Run Code Online (Sandbox Code Playgroud)

concurrency scala

91
推荐指数
1
解决办法
1万
查看次数

scala中的"return"和"try-catch-finally"块评估

以下两个代码生成不同的结果:

def x = try{
  true
} finally false
Run Code Online (Sandbox Code Playgroud)

调用x得到 true

def y:Boolean = try{
  return true
} finally {
  return false
}
Run Code Online (Sandbox Code Playgroud)

调用y得到 false

return版本的行为与Java相同.

我个人从不在scala中使用'return'.但是知道scala如何评估try-catch-finally块的值是很好的.谢谢.

scala

14
推荐指数
2
解决办法
3369
查看次数

将jdbc操作放在actor中是否很好?

我正在构建一个传统的webapp,它通过JDBC进行数据库CRUD操作.我想知道在当前的请求处理线程中将jdbc操作放入actor是否合适.我做了一些搜索,但没有找到演示这个的教程或示例应用程序.

那么缺点和优点是什么?这个异步化是否会像nio一样提高appserver的容量(即处理的并发请求)?

scala jdbc actor

14
推荐指数
1
解决办法
1432
查看次数

h:commandLink动作和f:ajax监听器的调用顺序

这是我的标记:

<h:commandLink value="#{partial}" action="#{hello.setCurrentPartial(partial)}">
    <f:ajax render="include" listener="#{hello.renderFragments}"/>
</h:commandLink>
Run Code Online (Sandbox Code Playgroud)

我试图在Mojarra-2.2.8(wildfly 8.2.0.Final内置)和MyFaces-2.2.7(按照此处的指导安装)中运行此页面.令人惊讶的是,当点击链接时,mojarra hello.renderFragments首先调用,然后hello.setCurrentPartialMyFaces采用相反的顺序,即hello.setCurrentPartial首先调用.

所以我的问题是在JSF Spec中是否有动作调用顺序和ajax监听器的定义.如果定义了订单,哪个实现是正确的?

ajax jsf myfaces jsf-2.2

12
推荐指数
1
解决办法
3176
查看次数

覆盖Pair的equals()方法

先前在scala-user邮件列表中询问了此问题,但没有确认答案.

scala> val T = new Pair(1, 2){
override def equals(obj:Any) = obj.isInstanceOf[(Int, Int)] && obj.asInstanceOf[(Int, Int)]._1 == this._1}
           }

T: (Int, Int) = (1,2)

scala> T match {
        case (1, 1) => println("matched")
        case _ => println("not matched")
   }

not matched


scala> (1, 1) match {
              case T => println("matched")
              case _ => println("not matched")
          }

not matched

scala> T == (1, 1)
res15: Boolean = true
Run Code Online (Sandbox Code Playgroud)

我认为常量(val)模式匹配结果取决于"等于"的返回值,但结果表明情况并非如此,那么标准是什么?

有人建议这case (1, 1) =>是一个提取器模式,Tuple2.unapply而是使用.所以我尝试了这些:

scala> Pair.unapply(T)
res1: …
Run Code Online (Sandbox Code Playgroud)

scala

11
推荐指数
2
解决办法
7925
查看次数

Akka何时会带来更好的表现?

我刚刚使用Akka编写了一个JDBC连接池.

它使用一个actor来保存真实数据库连接的"maxPoolSize"集合.调用者向池actor询问连接并接收a Future[Connection]并且连接的状态变为"忙",直到调用者将其返回到池中connection.close.如果所有连接都忙,则新的传入连接请求将被置于等待队列(也由池actor保持).稍后当返回连接时,将满足等待请求.

这个逻辑的实现在akka中非常容易,只需要几十行代码.但是,当使用BoneCP 多线程测试来测试性能时(即调用者close在完成Future[Connection]返回时立即连接getConnection.基准测试traversed所有close请求和Await结果Future),我发现Akka版本比许多其他连接池实现慢例如tomcat-jdbc,BoneCP甚至是公共DBCP.

我试过调试的内容:

  1. 将池actor分成多个,每个都包含所有真实连接的一部分
  2. 调整一些默认调度程序配置参数(吞吐量,并行性)

但没有看到明显的改善.

我的问题是:

  1. 这是一个合适的用例,使用akka会获得更好的性能吗?
  2. 如果是,我如何获得与那些手工制作的线程连接池实现类似或更好的基准数据?
  3. 如果不是,为什么?是否有任何既定标准可以帮助我决定何时使用akka

performance scala akka

9
推荐指数
1
解决办法
1733
查看次数

":"在类型参数中

在scala-arm项目中,我看到这样的代码:

def managed[A : Resource : Manifest](opener : => A) : ManagedResource[A] = new DefaultManagedResource(opener)
Run Code Online (Sandbox Code Playgroud)

有人可以解释[A:资源:清单]的含义吗?

scala context-bound

8
推荐指数
1
解决办法
934
查看次数

nonblocking-io vs blocking-io原始数据吞吐量

apache HTTPComponent文档中有一个声明:

与流行的看法相反,NIO在原始数据吞吐量方面的性能明显低于阻止I/O的性能."

真的吗?有人可以更详细地解释一下吗?什么是典型的用例

请求/响应处理需要解耦

java io performance nio

8
推荐指数
1
解决办法
1597
查看次数

scala动态确定类型

我想创建其类型由运行时数据确定的对象实例:

trait Business
case class Business1() extends Business 
case class Business2() extends Business

object Business {
  def fromData(data:Array[Byte]): Business = data(0) match {
    case 1 => new Business1
    case 2 => new Business2
    case _ => throw new RuntimeException("data error")
  }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码可以完成它的工作,但是它有一个关闭它的问题.每当我实现一个新的Business子类时,我都必须修改Business.fromData代码,例如

case 3 => new Business3
Run Code Online (Sandbox Code Playgroud)

如何定义Business.fromData一次,以后可以添加Business3,Business4而无需注册?

编辑

我终于意识到这是一个完美的用例Multimethod,即基于某个参数的函数进行调度.所以更一般的问题应该是" 如何在scala中做多方法 "?我相信设计模式只是因为语言无能力而存在,这就是为什么我不愿意接受基于工厂的答案.

scala

7
推荐指数
1
解决办法
247
查看次数

是否可以安全地关闭akka调度程序中的actor上下文

我知道sender在Future或调度程序中关闭方法调用或actor的内部状态是不安全的,但是actor的上下文呢?什么在ActorContext?在调度程序或将来的回调中关闭actor上下文是否安全?:

def receive: Receive = {
  case Msg => 
    system.scheduler.scheduleOnce(1 second) {
       context.actorOf[ChildActor]
    }
}
Run Code Online (Sandbox Code Playgroud)

scala akka

7
推荐指数
1
解决办法
872
查看次数

标签 统计

scala ×8

akka ×2

performance ×2

actor ×1

ajax ×1

concurrency ×1

context-bound ×1

io ×1

java ×1

jdbc ×1

jsf ×1

jsf-2.2 ×1

myfaces ×1

nio ×1