为什么我没有收到“询问超时”例外?

时间:2018-09-04 06:34:00

标签: scala exception timeout akka

我有2位演员,一位导演和一位儿童演员。

主管:

class DemoActorSupervisor(implicit val system: ActorSystem, config: Config) extends Actor {

  val childActor: ActorRef = context.actorOf(FromConfig.props(Props[DemoActorChild]), "DemoChildActor")

  context.watch(childActor)

  override def receive: Receive = {
    case s: String =>
      childActor forward s
  }
}

儿童演员:

class DemoActorChild extends Actor {
  def receive: Receive = {
    case s: String =>
      Thread.sleep(100)
      Future.successful(true) pipeTo (sender)
  }
}

主要方法:

object ABC extends App {
  implicit val system: ActorSystem = ActorSystem("Demo")

  implicit val config: Config = ConfigFactory.load()

  implicit val timeout: Timeout = Timeout(5, TimeUnit.MILLISECONDS)

  val supervisor = system.actorOf(DemoActorSupervisor.props(), "DemoSupervisor")

  val x: Future[Boolean] = (supervisor ? ("ASK")).mapTo[Boolean]
  x.foreach(println)
}

我已将询问超时设置为5毫秒,然后对主管演员进行询问。正在将消息转发给子演员。在逻辑上放置Thread.sleep(100)的儿童演员中,我应该将Ask Timeout例外设置为5毫秒,并且孩子需要100毫秒以上的时间来回复,但我没有得到Ask超时例外。 有人可以告诉我代码有什么问题吗?如何获得询问超时异常。

2 个答案:

答案 0 :(得分:2)

您可以在Excel: Open Spreadsheet "C:\Users\my_user\Documents\xyz.xlsx".ActiveSheet:"Default".Contains Header,Session:Default 的说明中看到:

  

一旦值可用,便会在将来异步处理该值。

     

警告:如果此未来从未完成或因失败而结束,则不会调用。

如果您想使用Future.foreach,则应编写如下内容:

Future.foreach

答案 1 :(得分:1)

再试一次:

import torch
from torchvision.transforms import *
from torchvision.datasets import MNIST
from torch.utils.data import DataLoader

transform_train = Compose([Resize(28, interpolation=2),
                           RandomHorizontalFlip(p=0.5),
                           ToTensor(),
                           Normalize([0.], [1.])])

trainset = MNIST(root='./data', train=True, download=True,
                 transform=transform_train)
trainloader = DataLoader(trainset, batch_size=32, shuffle=True, num_workers=2)
print(trainset[0][0].size(), trainset[0][0].min(), trainset[0][0].max())

(torch.Size([1, 28, 28]), tensor(0.), tensor(1.)) 仅处理成功案例,x.onComplete { case Success(v) => println(v) case Failure(v) => println(v) } 属于Future foreach,您需要通过代码来处理它。

或者接下来也可以:

akka.pattern.AskTimeoutException: