Multithreading 发送者成为演员[akka://Main/deadLetters]

Multithreading 发送者成为演员[akka://Main/deadLetters],multithreading,scala,akka,Multithreading,Scala,Akka,我不明白为什么会出现错误“死信”” 如您所见,sender变成了Actor[akka://Main/deadLetters]如果在名为getIdList的方法中使用Future和blocking。为什么呢?我不应该使用它吗?问题是在异步函数块中调用发送方。有一个简单的规则: 永远不要在可能异步执行的代码块中关闭发送方方法 sender是一个函数,返回当前处理的邮件的发件人。问题是,如果您在像onComplete这样的回调中调用sender,则此回调将异步执行。这意味着在此期间,参与者可能会处理其

我不明白为什么会出现错误“
死信”


如您所见,
sender
变成了
Actor[akka://Main/deadLetters]
如果在名为
getIdList
的方法中使用
Future
blocking
。为什么呢?我不应该使用它吗?

问题是在异步函数块中调用
发送方。有一个简单的规则:

永远不要在可能异步执行的代码块中关闭发送方方法

sender
是一个函数,返回当前处理的邮件的发件人。问题是,如果您在像
onComplete
这样的回调中调用
sender
,则此回调将异步执行。这意味着在此期间,参与者可能会处理其他消息,因此
发送者
功能可能不会报告原始消息的发送者

避免这种情况的一种方法是在执行异步代码之前将发送方存储在局部变量中:

def接收={
case Get=>
val s=发送方
//调用异步函数
myAsyncFunction onComplete{result=>
s!结果
}
}
另一种方法是使用@Vadzim指出的akka
pipeTo
函数:

import akka.pattern.pipe

def receive = {
  case Get =>
    // call an asynchronous function
    val result = myAsyncFunction

    result pipeTo sender
}
有关这方面的更多信息可以在akka文档中找到:

只需使用即可

import akka.pattern.pipe
getIdList pipeTo sender
有关说明,请参见:

在Future中使用异步方法(getIdList)明智吗?还是只使用sync方法(getIdListSync)?这取决于参与者的任务是什么。如果这是参与者应该执行的唯一任务,那么使用同步变量就可以了。在这种情况下,应使用相同类型的多个参与者和一个调度程序进行缩放。另一方面,如果演员在创建列表时应该做一些其他的事情,你应该考虑使用异步变体。AAAA,所以使用多线程(和期货)只有在有另一个任务(或者,一个以上的任务)在第一个正在执行的情况下工作时才是正确的,对吗?在actor中接收消息并异步执行所有工作以立即接收下一条消息(例如,在远程机器上执行任务)没有多大意义。为相同的任务生成多个参与者可以让您获得更多的控制(例如,您可以定义多少参与者应该并行工作)
import akka.pattern.pipe
getIdList pipeTo sender