Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在Scala中创建分布式内存服务_Multithreading_Scala_Distributed System - Fatal编程技术网

Multithreading 在Scala中创建分布式内存服务

Multithreading 在Scala中创建分布式内存服务,multithreading,scala,distributed-system,Multithreading,Scala,Distributed System,您认为Scala如何帮助我们编写像Redis这样的分布式内存服务(但多线程) Scala编程鼓励我们使用不可变数据,以避免共享数据和竞争条件,但是在这种数据存储中,不可变数据对我们没有帮助(我认为) 阻塞线程将是解决方案?Scala同样能处理不可变数据和可变数据 当然,强烈建议使用不可变数据——对于任何可以跨线程/参与者共享的数据 但是也强烈鼓励使用专用于单个线程/参与者的可变数据,即在一个永远不能跨线程/参与者共享的上下文中 一个简单的高级并发模式是: 将可变数据私有化给每个参与者: 将可变

您认为Scala如何帮助我们编写像Redis这样的分布式内存服务(但多线程)

Scala编程鼓励我们使用不可变数据,以避免共享数据和竞争条件,但是在这种数据存储中,不可变数据对我们没有帮助(我认为)


阻塞线程将是解决方案?

Scala同样能处理不可变数据和可变数据

当然,强烈建议使用不可变数据——对于任何可以跨线程/参与者共享的数据

但是也强烈鼓励使用专用于单个线程/参与者的可变数据,即在一个永远不能跨线程/参与者共享的上下文中

一个简单的高级并发模式是:

  • 将可变数据私有化给每个
    参与者
    • 将可变类型专用于单个参与者
    • 使用actor-act/receive/react方法操纵可变数据
  • 仅在
    Actor
    s之间共享不可变数据
    • 向其他参与者发送消息-但是将可变数据转换为不可变数据,并且只在参与者之间发送后者
  • 切勿在消息中向另一位
    参与者发送对
    参与者的引用
    • 由于(1),演员本身变得可变
    • 由于(2),它们不应该被共享
    • 这将阻止ActorA调用ActorB上的任何方法-所有通信都应通过消息(方法
      !!
  • 识别长时间运行的操作并使其异步。即使是超出CPU+L1缓存+L2缓存的简单操作,其速度也可能比CPU操作的速度慢100000到10000000倍,例如从内存读取大量数据、读取/写入磁盘、读取/写入网络-请参阅末尾的表:
  • 作为一项规则,不要阻塞异步操作——它通常会“取出”一个线程(消耗资源),如果不仔细设计,可能会导致死锁(运行时失败),并且可以始终以非阻塞方式处理。如果需要处理异步响应,请让异步请求在初始化过程中返回一个
    Future[T]
    。然后通过
    Future.onComplete
    (或者更好地通过
    Future.flatMap/Map/withFilter/Recover
    及其
    理解等价物指定响应处理代码,这是围绕
    onComplete
    的方便的“一元”包装)

  • Scala同样能很好地处理不可变数据和可变数据

    当然,强烈建议使用不可变数据——对于任何可以跨线程/参与者共享的数据

    但是也强烈鼓励使用专用于单个线程/参与者的可变数据,即在一个永远不能跨线程/参与者共享的上下文中

    一个简单的高级并发模式是:

  • 将可变数据私有化给每个
    参与者
    • 将可变类型专用于单个参与者
    • 使用actor-act/receive/react方法操纵可变数据
  • 仅在
    Actor
    s之间共享不可变数据
    • 向其他参与者发送消息-但是将可变数据转换为不可变数据,并且只在参与者之间发送后者
  • 切勿在消息中向另一位
    参与者发送对
    参与者的引用
    • 由于(1),演员本身变得可变
    • 由于(2),它们不应该被共享
    • 这将阻止ActorA调用ActorB上的任何方法-所有通信都应通过消息(方法
      !!
  • 识别长时间运行的操作并使其异步。即使是超出CPU+L1缓存+L2缓存的简单操作,其速度也可能比CPU操作的速度慢100000到10000000倍,例如从内存读取大量数据、读取/写入磁盘、读取/写入网络-请参阅末尾的表:
  • 作为一项规则,不要阻塞异步操作——它通常会“取出”一个线程(消耗资源),如果不仔细设计,可能会导致死锁(运行时失败),并且可以始终以非阻塞方式处理。如果需要处理异步响应,请让异步请求在初始化过程中返回一个
    Future[T]
    。然后通过
    Future.onComplete
    (或者更好地通过
    Future.flatMap/Map/withFilter/Recover
    及其
    理解等价物指定响应处理代码,这是围绕
    onComplete
    的方便的“一元”包装)

  • Scala同样能很好地处理不可变数据和可变数据

    当然,强烈建议使用不可变数据——对于任何可以跨线程/参与者共享的数据

    但是也强烈鼓励使用专用于单个线程/参与者的可变数据,即在一个永远不能跨线程/参与者共享的上下文中

    一个简单的高级并发模式是:

  • 将可变数据私有化给每个
    参与者
    • 将可变类型专用于单个参与者
    • 使用actor-act/receive/react方法操纵可变数据
  • 仅在
    Actor
    s之间共享不可变数据
    • 向其他参与者发送消息-但是将可变数据转换为不可变数据,并且只在参与者之间发送后者
  • 切勿在消息中向另一位
    参与者发送对
    参与者的引用
    • 由于(1),演员本身变得可变
    • 由于(2),它们不应该被共享
    • 这将阻止ActorA调用ActorB上的任何方法-所有通信都应通过消息(方法
      !!
  • 识别长时间运行的操作并使其异步。即使是超出CPU+L1缓存+L2缓存的简单操作也可以是10