2012-02-04 69 views
8

最好的回答是在評論部分(所以我不能給他們分數的答案:()是playframework真正異步嗎?

我想知道如果playframework是在這種方式異步(這將是真正的異步,或完全異步)是的,在前端播放是異步的,允許100個線程上有1000個客戶端,但在後端,沒有辦法實現這一點,或者我錯了(我希望是這樣).....

public static void someRequest(String id) { 

    //This method adds listener to a nio socket listener so it returns 
    //IMMEDIATELY and page can't be rendered at this point 
    fetchRemoteDataFromOtherSystem(id, new MyListener()); 

    // DO NOT RENDER PAGE YET but return so thread can be used for other requests 
} 

public class MyListener extends SomeListener { 
    public void fireResponse(Response response) { 
     renderPage(response); 
    } 
} 

注意,這將是極端的異步行爲,也請注意,如果你有一個後端系統並花幾秒鐘到每個請求的響應,你現在需要約100更少的機器爲用戶服務的相同。在在後端系統速度非常快的正常情況下,當然不會有性能差異。

感謝, 院長

+3

你讀過這個http://www.playframework.org/documentation/1.2.4/asynchronous?特別是關於Promise的東西。這也許是有趣的:http://caffeinelab.net/2010/06/29/asynchronous-http-client-in-play-framework/ – nylund 2012-02-04 19:18:20

+0

好吧,那真棒,發佈它作爲答案....第二個環節非常明確!很好的回答!!!!(我怎麼不能把評論標記爲正確的答案:() – 2012-02-06 01:52:04

+0

嗯,這個例子顯示了一個Future,它沒有能力添加一個監聽器,所以然後玩必須做一個民意調查並要求isDone,isDone遍地????那種臭的....爲什麼不直接使用響應線程通知播放,然後會叫下來到控制器方法的第二個時間 – 2012-02-09 18:15:55

回答

6

看一看Play 2.0。它仍然是一個測試版,但它有some nice asynchronous stuff

對於第一次玩,看看this documentation page,其中涵蓋了Play的異步功能,和Play Akka module(同時你也在,也Akka itself :))。

+0

的問題:它說,它暫停操作......這意味着什麼?如果我正在發出一個nio請求,我可以立即返回一個Promise並將它發送給await方法......它是在執行一些字節碼魔術,然後返回調用堆棧並返回當我用響應調用promise對象時,它會繼續嗎?我可以看到,如果是這樣的話,非常可愛,您可以編寫同步代碼,並且它變得異步。 – 2012-02-04 22:46:39

+0

我們去玩2.0,它比開發1.2.x的開發效率更低。我們最終將所有2.0 scala代碼恢復爲1.2.x java代碼。 (我們喜歡scala,但即使調整爲html頁面導致整個重新編譯,這真的很煩人)。 – 2013-04-23 15:11:36

+0

如果您在同一瀏覽器的不同選項卡中發出相同的請求,它們似乎是同步的。 – Rafael 2015-09-11 16:38:30

1

打2是從地面完全以異步起來,它採用阿卡和網狀。您可以爲您的前端和服務使用遊戲(例如:作爲休息)。另外玩也是無狀態的,因此,通過添加服務器來擴展它非常容易。

+0

更多的細節會很好,但是.....就像上面那樣。有關於它的文檔嗎? – 2012-02-06 01:38:51

+0

這裏是來自斯卡拉天的視頻解釋異步行爲http://days2011.scala-lang.org/node/138/296此外這個文件是一個很好的資源https://github.com/playframework/Play20/wiki/ScalaHome – sirmak 2012-02-06 06:43:18

0

添加一些細節在這裏。它看起來像Play發明了一種叫Promise的對象,它擴展了Future,並且有一種方法來添加一個偵聽器,所以我假設在發送請求和響應線程調用Promise.setResponse(xxx)後,play會在Promise對象上添加一個偵聽器),該方法將檢查偵聽器是否已被添加,如果是,將調用偵聽器來告訴播放已收到響應,然後播放將其轉儲到隊列中以在其線程上處理。

但是,如果您的響應在播放框架中添加它的監聽器,當播放調用addListener時,我「假設」它的代碼是該響應已經在對象上設置了響應,如果是,則使用playframeworks現有線程調用監聽器它在playframework的隊列中(或者至少我希望是這樣)。

我不知道,如果承諾是移植回的例子是用未來這戲會做投票,看看當響應回來......然而ICK玩1.2.x的....我總是想知道爲什麼在這些Future對象上沒有addResponseListener ......從來不喜歡這樣。