【问题标题】:how to make the program pause when actor is running演员运行时如何让程序暂停
【发布时间】:2015-08-27 22:50:22
【问题描述】:

例如

import scala.actors.Actor
import scala.actors.Actor._

object Main {
  class Pong extends Actor {
    def act() {
      var pongCount = 0
      while (true) {
        receive {
          case "Ping" =>
            if (pongCount % 1000 == 0)
              Console.println("Pong: ping "+pongCount)
            sender ! "Pong"
            pongCount = pongCount + 1
          case "Stop" =>
            Console.println("Pong: stop")
            exit()
        }
      }
    }
  }

  class Ping(count: Int, pong: Actor) extends Actor {
    def act() {
      var pingsLeft = count - 1
      pong ! "Ping"
      while (true) {
        receive {
          case "Pong" =>
            if (pingsLeft % 1000 == 0)
              Console.println("Ping: pong")
            if (pingsLeft > 0) {
              pong ! "Ping"
              pingsLeft -= 1
            } else {
              Console.println("Ping: stop")
              pong ! "Stop"
              exit()
            }
        }
      }
    }
  }

  def main(args: Array[String]): Unit = {
    val pong = new Pong
    val ping = new Ping(100000, pong)
    ping.start
    pong.start
    println("???")
  }

}

我尝试打印“???”在两个actor调用exit()之后,现在打印在“Ping: Stop”和“Pong stop”之前

我试过在actor中设置一个flag,actor运行时flag为false,actor停止时flag为true,在main func中有一个while循环,比如while (actor.flag == false) {},但是没有'不起作用,这是一个无限循环:-/

所以,请给我一些建议。

【问题讨论】:

    标签: multithreading scala parallel-processing actor


    【解决方案1】:

    如果您需要在 akka 中进行同步调用,请使用 ask 模式。喜欢

    Await.result(ping ? "ping")  
    

    另外,你最好使用actor系统来创建actor。

    import akka.actor.{ActorRef, Props, Actor, ActorSystem}
    import akka.pattern.ask
    import akka.util.Timeout
    
    import scala.concurrent.Await
    import scala.concurrent.duration._
    import scala.concurrent.ExecutionContext.Implicits.global
    
    object Test extends App {
    
      implicit val timeout = Timeout(3 second)
      val system = ActorSystem("ActorSystem")
    
      class Pong extends Actor {
        def receive: Receive = {
          case "Ping" =>
            println("ping")
            context.stop(self)
        }
      }
    
      lazy val pong = system.actorOf(Props(new Pong), "Pong")
    
      val x = pong.ask("Ping")
      val res = Await.result(x, timeout.duration)
      println("????")
      system.shutdown()
    
    }
    

    【讨论】:

    • Thks,有没有办法使用 scala.actors 来获取它?
    • 如您所见here scala Actors 库已弃用,将在未来的 Scala 版本中删除。用户应该使用包 akka.actor 中的 Akka Actor。
    猜你喜欢
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 2013-03-09
    • 2020-07-13
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多