我有一个演员,打算做一个长时间运行的工作而不再收到任何消息:
actor {
def receieve => longRunningJob()
}
如何调试杀死此演员?
我已经按照文档说明"在演员中,你可以通过使用上下文引用来阻止子演员:"
context.stop(childActor)
我还尝试向孩子发送Kill消息,Stop消息和PoisonPill消息,但是在长时间运行的工作过程中没有任何东西停止。
答案 0 :(得分:6)
并不是说停止演员失败,就像Actors永远不会有机会处理与停止演员相关的消息一样。参与者是设计上的单线程,应该构造成尽可能少地阻塞消息循环。
在这种情况下,您真正要求的是"如何中断线程" ,因为longRunningJob
似乎是一个单线程,阻塞,时间密集型任务答案是,确实没有好办法。
进入"处理长时间运行的作业" 状态的Actor应该在不阻塞消息循环本身的情况下这样做,或者让作业本身是异步的(离开如果演员被停止,它会孤立并运行)或者作业本身由许多小步骤组成,每个步骤都会触发下一步,并返回一条消息,以便a)您可以接收其他消息并且b)有机会在中途打断工作。