假设我在actor上执行Ask(),但有一些超时,如果请求超时,有没有办法让底层actor停止处理事情?
Ask()
xqkwcwgp1#
简而言之,答案是否定的,你做不到。长的回答是看情况而定。例如,您可以通过Future将参与者的工作移动到另一个执行上下文。这将允许您的参与者对其他消息作出React,但如果参与者已启动的Future被执行上下文拾取并且未挂起在执行上下文的队列中,则无法取消该Future。您可以编写一些智能的Future Package 器,在开始工作之前检查future是否已被取消。(这意味着您需要以某种方式捕获此线程)并跳跃到工作将命中Object.wait或Thread.sleep方法,也就是说,只有在这些地方才能收到中断异常。但不能保证这种情况会发生。
Future
Object.wait
Thread.sleep
gk7wooem2#
不,你不能。你唯一能做的就是向一个参与者发送一条消息。你不能用任何其他方式"让“参与者中断它。而且,在正常情况下,消息是按顺序处理的,任何后续的“停止处理”消息都只能在第一条消息已经完成后才能处理。我认为你的问题的解决方案将有点取决于你为什么怀疑演员可能在回应时“超时”。例如,您可能会认为Actor有时会有消息积压,我认为最好的解决方案可能是将超时作为消息的一部分。在您的receiveMessage处理程序中,您可以在执行实际工作之前检查此“请求到期”时间,如果超时已过,则丢弃该消息。
receiveMessage
2条答案
按热度按时间xqkwcwgp1#
简而言之,答案是否定的,你做不到。
长的回答是看情况而定。
例如,您可以通过
Future
将参与者的工作移动到另一个执行上下文。这将允许您的参与者对其他消息作出React,但如果参与者已启动的Future
被执行上下文拾取并且未挂起在执行上下文的队列中,则无法取消该Future
。您可以编写一些智能的
Future
Package 器,在开始工作之前检查future是否已被取消。(这意味着您需要以某种方式捕获此线程)并跳跃到工作将命中Object.wait
或Thread.sleep
方法,也就是说,只有在这些地方才能收到中断异常。但不能保证这种情况会发生。gk7wooem2#
不,你不能。你唯一能做的就是向一个参与者发送一条消息。你不能用任何其他方式"让“参与者中断它。而且,在正常情况下,消息是按顺序处理的,任何后续的“停止处理”消息都只能在第一条消息已经完成后才能处理。
我认为你的问题的解决方案将有点取决于你为什么怀疑演员可能在回应时“超时”。
例如,您可能会认为Actor有时会有消息积压,我认为最好的解决方案可能是将超时作为消息的一部分。在您的
receiveMessage
处理程序中,您可以在执行实际工作之前检查此“请求到期”时间,如果超时已过,则丢弃该消息。