小编ShS*_*ShS的帖子

Akka:两个演员之间同步状态的正确模式

在重写persistentViewAkka中弃用的过程中,我有一个需要快照其状态的读取actor,并且到目前为止读取了日志事件偏移量.要停止需要序列化复合数据结构的视图actor(状态+偏移量),我将偏移值快照的责任委托给子actor.然后问题是同步这两者之间的偏移值.目前在阅读演员,我有:

case RecoveryCompleted ?
  implicit val ec = context.dispatcher
  val lastSequenceNr = (sequenceSnapshotterRef ? GetLastSnapshottedSequenceNr).mapTo[QueryOffset]
  lastSequenceNr onComplete {
    case Success(QueryOffset(sequenceNr)) ?
      offsetForNextFetch = sequenceNr
      doSomethingBasedOnThecompositeData()
      ...
Run Code Online (Sandbox Code Playgroud)

并且为了同步快照,更新子actor的偏移值,我这样做:

case RequestSnapshot ?
  implicit val ec = context.dispatcher
  val offsetUpdated = sequenceSnapshotterRef ? 
QueryViewSequenceApi.UpdateSequenceNr(offsetForNextFetch)

  offsetUpdated map {
    _ ?
      saveSnapshot()
      snapshotRequested = false
  } recover{
    case _ ?
      self ! RequestSnapshot
      log.debug("QueryViewSequenceSnapshotter not reachable. Will try again.")
  }
}
Run Code Online (Sandbox Code Playgroud)

然而,这意味着如果儿童演员的确认丢失或者儿童演员在发送消息之前死亡,然后视图演员在等待offsetUpdated来自儿童演员的响应时死亡,则偏移和状态将处于未同步状态当父actor试图恢复时的状态.

  • 这种情况甚至值得担心吗?如果一个当地的儿童演员只是简单地做一个简单的算术就像我的孩子演员的情况那样会随机死亡吗?
  • 如何修改设计以确保可以处理?我可能会在双方都引入一个确认,并在双方引入两阶段同步机制,但这可能是错误的.

以下是该问题的完整背景.

更新:阅读有关消息传递可靠性的更多 …

persistence synchronization actor akka akka-persistence

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

Scala:通用加权平均函数

我想实现一个通用加权平均函数,它放宽了对值的要求,并且权重属于同一类型.即,我想支持说:(value:Float,weight:Int)(value:Int,weight:Float)参数的序列,而不仅仅是:(value:Int,weight:Int).[请参阅我之前提到的问题.]

这就是我目前拥有的:

def weightedSum[A: Numeric](weightedValues: GenSeq[(A, A)]): (A, A)

def weightedAverage[A: Numeric](weightedValues: GenSeq[(A, A)]): A = {
    val (weightSum, weightedValueSum) = weightedSum(weightedValues)
    implicitly[Numeric[A]] match {
        case num: Fractional[A] => ...
        case num: Integral[A] => ...
        case _ => sys.error("Undivisable numeric!")
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我喂它,例如:

val values:Seq[(Float,Float)] = List((1,2f),(1,3f))
val avg= weightedAverage(values)
Run Code Online (Sandbox Code Playgroud)

但是,如果我不"重叠"权重IntFloat:

val values= List((1,2f),(1,3f)) //scalac sees it as Seq[(Int,Float)] 
val avg= weightedAverage(values)
Run Code Online (Sandbox Code Playgroud)

Scala编译器会告诉我:

错误:无法找到Numeric类型的证据参数的隐含值[AnyVal]
val avg = weightedAverage(values) …

generics scala implicit implicit-conversion

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

Scala:泛型函数乘以不同类型的数字

我正在尝试编写通用的加权平均函数.我想放宽对值和重量相同类型的要求.即,我想支持说:(value:Float,weight:Int)(value:Int,weight:Float)参数的序列而不仅仅是:(value:Int,weight:Int)

为此,我首先需要实现一个带有两个通用数值并返回其产品的函数.

def times[A: Numeric, B: Numeric](x: B, y: A): (A, B) : ??? = {...}
Run Code Online (Sandbox Code Playgroud)

编写签名并考虑返回类型,让我意识到我需要为Numerics定义某种层次结构来确定返回类型.即x:Float*y:Int=z:Float,x:Float*y:Double=z:Double.

现在,数字类定义操作plus,times等只为同一类型的参数.我想我需要实现一个类型:

class NumericConverter[Numeirc[A],Numeric[B]]{
type BiggerType=???
}
Run Code Online (Sandbox Code Playgroud)

这样我就可以把我的时间函数写成:

def times[A: Numeric, B: Numeric](x: B, y: A): (A, B) :
NumericConverter[Numeirc[A],Numeric[B]].BiggerType= {...}
Run Code Online (Sandbox Code Playgroud)

并将"较小的类型"转换为"较大的类型"并将其转换为times().

我是在正确的轨道上吗?我将如何"实施" BiggerType

显然我做不了类似的事情:

type myType = if(...) Int else Float
Run Code Online (Sandbox Code Playgroud)

因为它是动态评估的,所以它不起作用.

我知道我可以使用Scalaz等来做这个,但这是一个学术练习,我想了解如何编写一个静态返回基于参数类型的类型的函数.

如果有更简单的方法,请随时告诉我.

更新:

这就是我想出来的.

abstract class NumericsConvert[A: Numeric,B: Numeric]{

    def AisBiggerThanB: Boolean …
Run Code Online (Sandbox Code Playgroud)

generics scala numeric implicit

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

Cmake:将子项目目标导出到主项目

我目前有一个名为LIBS的项目,其结构如下:

??? Lib1
?   ??? CMakeLists.txt
?   ??? lib1-class.cpp
?   ??? lib1-class.h
??? lib2
?   ??? CMakeLists.txt
?   ??? lib2-class.cpp
?   ??? lib2-class.h
??? cmake
?   ??? LIBSConfig.cmake.in
??? CMakeLists.txt                                                           
Run Code Online (Sandbox Code Playgroud)

在主cmake文件中,我有:

install(
        TARGETS
        lib1
        lib2
        DESTINATION
        ${PROJECT_DIRNAME_lib}
        EXPORT
        ${PROJECT_NAME}Exports
)

install(
        EXPORT
        ${PROJECT_NAME}Exports
        DESTINATION
        ${PROJECT_DIRNAME_lib}
)
Run Code Online (Sandbox Code Playgroud)

因为我想将它们导出到find_package()可以发现的包中.

我的问题是我生成lib1lib2在各自的目录中安装它们时,Cmake告诉我

Error:install TARGETS given target "lib1" which does not exist in this directory.
Run Code Online (Sandbox Code Playgroud)

正如这里所建议的,我的理解是我应该Export()在lib1和lib2中使用以下形式的东西:

export(TARGETS lib1 FILE lib1Exports.cmake)
Run Code Online (Sandbox Code Playgroud)

LIBS项目中,有这样的事情:

ADD_LIBRARY(lib1 UNKNOWN …
Run Code Online (Sandbox Code Playgroud)

c++ cmake relocation

6
推荐指数
1
解决办法
3665
查看次数

同步调用锁定条件的 signalAll() 时出现 IllegalMonitorStateException

我有:

static public final ReentrantLock lock  = new ReentrantLock();
static public Condition my_condition    = lock.newCondition();
Run Code Online (Sandbox Code Playgroud)

myClass_1myClass_2I类电话:

synchronized (myClass_1.my_condition){
    myClass_1.my_condition.signalAll();
}
Run Code Online (Sandbox Code Playgroud)

这给了我java.lang.IllegalMonitorStateException. 我已经在signall()通话中同步了。是什么原因造成的?

java multithreading locking synchronized

3
推荐指数
1
解决办法
4963
查看次数

Cmake:链接到静态内部库而不导出它

我有一个这种结构的项目:

/path/to/my/project
??? CMakeLists.txt
??? internal-libs
?   ??? internal-lib1
??? libs
?   ??? lib1
?   ??? lib2
Run Code Online (Sandbox Code Playgroud)

lib1 是一个静态库.

lib2 是一个静态库.

internal-lib1 是一个静态库.

lib2静态链接到lib2和internal-lib1.lib1并将lib2被出口,但internal-lib1将被抛在后面.对于联系,我有:

target_link_libraries(lib2 PRIVATE internal-lib1)
target_link_libraries(lib2 PRIVATE lib1)
Run Code Online (Sandbox Code Playgroud)

我的理解是因为我是静态链接和私有链接,所以关于internal-lib1的所有信息都将包含在lib2中,并且我不必将internal-lib1导出到外部世界.

但是,当我尝试在客户端程序中使用它时,我收到错误:

/usr/bin/ld cannot find -llib-internal1
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

在我生成的导出配置文件中,我有:

# Create imported target lib2
add_library(lib2 STATIC IMPORTED)
set_target_properties(lib2 PROPERTIES
INTERFACE_LINK_LIBRARIES "$<LINK_ONLY:lib1>;**$<LINK_ONLY:internal-lib1>**"
)
# Create imported target lib1
add_library(lib1 STATIC IMPORTED)
Run Code Online (Sandbox Code Playgroud)

我误解了静态链接还是我的设置有问题?我正在使用cmake 3.2.2.我的所有目标包括私人.我不明白为什么INTERFACE_LINK_LIBRARIES填充条目和LINK_ONLY意味着什么.

ps实际上lib1和lib2应该是共享库但我甚至无法使静态版本工作,所以为了简单起见,我在描述可导出库的静态情况.

c++ linker cmake

3
推荐指数
2
解决办法
1501
查看次数

Apache-Spark:针对RDD的嵌套for-understanding

我正在尝试使用Spark-RDD等效的本地Scala代码:

val intList1=List(1,2,3,4,5,6)
val intList2=List(10,20,30,40,50,60)

val divisiblePairs=for(
    int1<-intList1;
    int2<-intList2
    if int2 % int1 == 0
) yield(int1,int2)

divisiblePairs.groupBy(_._1) //Map(6 -> List((6,30), (6,60)),...)
Run Code Online (Sandbox Code Playgroud)

我试过了:

val intRDD1=sc.parallelize(List(1,2,3,4,5,6))
val intRDD2=sc.parallelize(List(10,20,30,40,50,60))

val divisiblePairs=
for(
    int1<-intRDD1;
    int2<-intRDD2
    if int2 % int1 == 0
) yield(int1,int2)
Run Code Online (Sandbox Code Playgroud)

这需要一些额外的工作,但我得到错误,即使在理解的主体:

错误:类型不匹配; 发现:org.apache.spark.rdd.RDD [(Int,Int)]必需:TraversableOnce [?] int2 <-intList2

scala for-comprehension apache-spark rdd

0
推荐指数
1
解决办法
316
查看次数