【问题标题】:What is the meaning of the following statment from play! documentation?下面的语句from play是什么意思!文件?
【发布时间】:2015-04-15 18:50:54
【问题描述】:

来自play documentation

操作代码是否返回 Result 或 Promise,两者都 各种返回的对象在内部以相同的方式处理。那里 是一种Action,是异步的,不是两种 (一个同步的和一个异步的)。返回一个 Promise 是一个 编写非阻塞代码的技术。

这是否意味着返回 Promise<Result> 而不是返回 Result 没有区别/优势或劣势?如果玩!框架在Promise 中包含对public static Result function() 的调用,开发人员明确返回Promise<Result> 是否有意义?

【问题讨论】:

    标签: java playframework promise


    【解决方案1】:

    不,显式返回一个Promise<Result>是没有意义的,如果你的代码是同步的,只需返回一个Result

    但是,有时您的代码会调用返回 Promise 的其他代码,因为它执行非阻塞异步操作。在这种情况下,您应该转换 Promise 以从中提取您需要的信息,然后返回它。通过将其保留为Promise 而不是展开它 - 您不会强制线程阻塞并节省上下文切换的开销,这可能很重要。

    例如,假设您要查询网络服务:

    WSRequestHolder holder = WS.url("someUrl");
    Promise<JsonNode> json = holder.get();
    

    现在,您可以执行以下操作:

    JsonNode jsonResult = json.get(); // force the program to wait
    return jsonResult; // return it
    

    但这会强制线程在阻塞 io 操作中进行上下文切换。相反,您可以直接返回一个承诺:

    return json; // return the promise
    

    并且节省上下文切换的开销,如果需要先操作,也可以使用.map

    【讨论】:

    • Benjamin,一段时间后回到这个问题,我还有一些问题。我理解json.get(); 的意思,它将强制线程上下文切换到阻塞 I/O 操作。但是 I/O 最终还是会发生,对吧?那么某些线程会在某个时间点阻塞?
    • I/O 可以在没有线程阻塞的情况下发生 - 这被称为(毫不奇怪)非阻塞 IO,它通过事件系统发生。
    • 我在stackoverflow.com/questions/32582411/… 也有类似的问题。如果您能伸出援手,那就太好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 2013-07-11
    • 2014-02-08
    • 2011-11-18
    • 2012-05-07
    相关资源
    最近更新 更多