Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Playframework 游戏框架控制器动作是否同步?_Playframework - Fatal编程技术网

Playframework 游戏框架控制器动作是否同步?

Playframework 游戏框架控制器动作是否同步?,playframework,Playframework,我最近在测试一些代码,当我注意到每个控制器操作/方法一次只有一个线程处于活动状态时,我有点惊讶。例如,考虑控制器的以下2个动作: public static void testThread() { Logger.info("Start"); try { Logger.info("Sleeping..."); Thread.sleep(30000); } catch (Exception e) { }

我最近在测试一些代码,当我注意到每个控制器操作/方法一次只有一个线程处于活动状态时,我有点惊讶。例如,考虑控制器的以下2个动作:

public static void testThread()
{
    Logger.info("Start");

    try
    {
        Logger.info("Sleeping...");
        Thread.sleep(30000);
    }
    catch (Exception e)
    {

    }

    Logger.info("End");
}

public static void testThread2()
{
    Logger.info("Start");

    try
    {
        Logger.info("Sleeping...");
        Thread.sleep(30000);
    }
    catch (Exception e)
    {

    }

    Logger.info("End");
}
从2个浏览器会话调用testThread(),在任何给定时间仅执行1个。第二个请求等待第一个请求完成。但是,从一个浏览器调用testThread(),从另一个浏览器调用testThread2()会产生预期的结果。只是为了说明默认线程(play.pool)的数量增加了,并且在Tomcat中作为WAR运行时也存在这种行为


有人能解释为什么会发生这种情况,以及是否有办法防止这种行为吗?

播放动作是静态的,而不是同步的


然而,同步的是播放处理程序线程。在开发模式下,它默认为单个线程,因此,这可能就是您看到的。

在进行更多测试后,如果是同一个浏览器或不同的浏览器(可能取决于播放会话),则会产生不同

例如,同时访问同一控制器的两个Chrome选项卡将是连续的


然而,Chrome的1个和Safari的1个将如预期的那样是多线程的。

我重新测试,结果表明这是一个浏览器功能(在playframework生产模式下)。我用wireshark嗅探,直到第一个请求完成,浏览器才发送第二个请求。事实证明,这与playframework无关,但这是一个有趣的发现


所以,当playframework处于生产模式时,它不会进行任何同步,即使它是同一个客户端,但是客户端有自己的行为,可能会在发送第二个请求之前进行同步。

您是在产品模式还是开发模式下运行?实际上,在开发模式下,将提供单线程服务。在TomCat中部署时,它应该强制PROD模式,因此这种行为在TomCat中不可能存在,仅当从同一浏览器请求时…哇,有趣的捕获…在PROD模式下运行会将来自同一浏览器的请求序列化到同一控制器…只是我自己在生产模式下尝试过。请注意,看到我的答案了…不是playframework,但浏览器没有发送第二个请求(我使用wireshark查看发生了什么)。我不明白为什么我会看到相同的行为;这个解释很正确。感谢@user1212274和Dean Hiller提供详细信息!