代码之家  ›  专栏  ›  技术社区  ›  Alexander Stolz

Scala远程演员

  •  17
  • Alexander Stolz  · 技术社区  · 17 年前

    是否有任何指南或教程解释了远程使用scala actors的可能性?到目前为止,我只找到了一个例子(没有评论),但这还不够。

    6 回复  |  直到 17 年前
        1
  •  10
  •   dmeister    15 年前

    我写过 an article with an example app to explain the use of Remote Actors 不久前。

    好吧,它在代码中没有注释(也许你甚至是指那篇文章),但代码下面有解释。

        2
  •  3
  •   Szymon Jachim    17 年前

    只要小心发送可序列化的消息(case类和case对象都是!),并确保对方可以创建类。 注意类路径中的自定义类加载器或缺失的JAR。

        3
  •  1
  •   Daniel Spiewak    17 年前

    这些我都不知道。这几乎是一种“穿越丛林”的方法。然而,从API来看,事情应该和普通演员差不多一样,他们有一两个教程(现在还有几本书)。

    如果你确实使用了远程参与者,我们(社区)肯定会欢迎有经验的用户提供这样的教程!

        4
  •  1
  •   Quartz    15 年前

    Akka框架已经 remote actors .API与常规scala参与者非常相似。

    它们也提供了一定程度的自动集群,但并不完整。

        5
  •  1
  •   Arne    15 年前

    最近在www.scala-lang.org的首页上添加了一个指南,这是链接 http://www.scala-lang.org/docu/files/actors-api/actors_api_guide.html#

        6
  •  1
  •   Connor Doyle    14 年前

    也许这是一个墓地,但我到处找,找不到多少。希望这能帮助到别人。

    我在跑步 Mac OS 10.6.8 Scala 2.9.0.1 。我在运行规范远程参与者示例时遇到了问题。我最终得到了以下代码。

    注: 清除 这种方法只是为了防止消息堆积。这对例子来说并不重要。同样,呼吁 线程睡眠 只是为了更容易看到运行时发生了什么。

    编译它,然后在单独的shell实例中执行以下操作:

    $> scala Ping
    

    $> scala Pong
    

    以任何顺序。您可以通过一次杀死其中一个并跟踪代码来进行实验。

    import scala.actors._
    import scala.actors.Actor._
    import scala.actors.remote._
    import scala.actors.remote.RemoteActor._
    
    /** @author Connor Doyle */
    
    // Remote messages must be serializable.
    // The easist way to do this is to wrap
    // them with a case class
    case class Message(text: String)
    
    abstract class PingPongActor extends Actor with App {
        val pingPort = 9000
        val pongPort = 9001
        val delay = 1000
        classLoader = getClass().getClassLoader() // hack!
        start
    
        // this method consumes all pending messages
        // the library should have implemented an atomic 
        // receiveAndClear operation
        def clear: Unit = receiveWithin(0) {
            case TIMEOUT => ()
            case _ => clear
        }
    }
    
    object Ping extends PingPongActor {
    
        // result of select already lazy, but explicit lazy conveys
        // semantics clearly
        lazy val pong = select(Node("localhost", pongPort), 'pong)
    
        def act = {
            alive(pingPort)
            register('ping, self)
            loop {
                pong ! Message("ping")
                receiveWithin(delay * 2) {
                    case Message(text: String) => {
                        clear
                        println("received: "+text)
                        Thread.sleep(delay) // wait a while
                    }
                    case TIMEOUT => println("ping: timed out!")
                }
            }
        }
    }
    
    object Pong extends PingPongActor {
    
        lazy val ping = select(Node("localhost", pingPort), 'ping)
    
        def act = {
            alive(pongPort)
            register('pong, self)
            loop {
                receiveWithin(delay * 2) {
                    case Message(text: String) => {
                        println("received: "+text)
                        Thread.sleep(delay) // wait a while
                        clear
                        ping ! Message("pong")
                    }
                    case TIMEOUT => println("pong: timed out")
                }
            }
        }
    }
    

    干杯

    推荐文章