在playframework的文档here中写了:
public static void loopWithoutBlocking() {
for(int i=0; i<=10; i++) {
Logger.info(i);
await("1s");
}
renderText("Loop finished");
}
我真的不明白它究竟是如何运作的:
例如当我们在第一个请求i = 1中调用该方法时,然后..解锁并等待..并且新请求转到该方法然后它再次从i = 0开始?当第一次请求唤醒时,它将具有i = 1或0或2?
这里没有使用任何有状态机制?比如在请求之间存储i ..?
答案 0 :(得分:6)
这在Play 1.1中的工作方式是使用suspend函数,该函数在Play 1.2中用await()替换。在1.1中,挂起函数没有在同一点启动该过程,而只是在该过程“暂停”指定的时间后,使用相同的输入调用该方法。
原因是确保“休眠”的线程没有阻止其他请求被处理(尝试在开发模式下,只运行1个线程,等待10秒,你仍然可以发送一个第二个请求,它被处理)。所以,在Play1.1中,你必须保持状态。
Play 1.2和使用await之间的区别在于,方法的重新启动是在幕后完成的,并且它在停止的位置重新启动方法,因此也应该保留变量的状态。 / p>
在您的示例中(取自文档),它应该简单地从0循环到9,并在每个点等待1秒。如果您没有遇到这种情况,那么我认为这是一个错误。