2013-04-24 51 views
0

我正在用Python開發Google App Engine上的出價系統。產品在預定時間開放出價,並且出價持續3分鐘。產品的價格在3分鐘內每秒下降一個常數,直到它爲零。並且首先按下「出價」按鈕的出價者中標。此應用程序中的一個關鍵問題是,所有用戶之間的時間應該完全同步,以便每個人都能夠同時看到相同的價格。以下是我到目前爲止的內容,但它有不準確的計時器。Google應用引擎:同步所有服務器的時間和客戶的JavaScript計時器

當用戶訪問或刷新頁面時,Python代碼會將服務器時間傳遞給javascript定時器,並且定時器開始倒計時。簡化JavaScript是如下:

var count = {{timeToBid}}; // 'timeToBid' is in seconds and is inserted by the template engine 
var price =={{initialPrice}} // The initial product price 
var currentPrice;    // Current price 

function updateTime() { 
    timeStr = ...; // Set the time string to be HH:MM:SS 
    $("#timeToBid").html(timeStr); // Display time in the 'timeToBid' div 
    if (count <= 180) { // Start bidding 
    currentPrice = ...; // Calculate the current price 
    $("#currentPrice").html(currentPrice); // Update current price 
    } 
    count--; 
    setTimeout(updateTime, 1000); // Executed every second 
} 

updateTime(); 

以上的JavaScript從用戶瀏覽器之間未同步的定時器,以及未同步的服務器時間(見this)顯著缺點。每個瀏覽器中顯示的當前價格可能在很大的範圍內變化,這使系統完全無法使用。這是一個相當複雜的問題,我正在尋求好的解決方案。一秒或兩秒鐘的時間不準確是可以接受的。我的問題:

(a)爲了使javascript定時器更加準確,我計劃使用AJAX每10秒檢索一次服務器時間,然後更新'count'。這是一個好的解決方案嗎?或者還有其他選擇?

$.ajax({ 
    url: "/getServerTime", 
    cache: false, 
    success: function(serverCount) { 
    count = parseInt(serverCount); 
    return false; 
    } 
}); 

(b)我完全不知道如何解決服務器時間不一致問題。任何人都可以幫忙嗎?謝謝。

回答

1

App Engine服務器上的系統時鐘保持同步:請參閱this authoritative answer

每個App Engine HTTP響應都有一個Date標題,像這樣Date: Wed, 24 Apr 2013 06:03:37 GMT。您可以使用它將瀏覽器與服務器時間同步。

+0

真的嗎?那麼我提供的鏈接中的討論是錯誤的?哦,我的,這真是個好消息。我曾經使用Python的'datetime.datetime.now()'來獲取服務器時間,而不是'System.currentTimeMillis()'。可以嗎?非常感謝。 – 2013-04-24 06:28:54

+0

'System.currentTimeMillis()'是java。你應該使用任何python提供的。另外,不要使用每個請求中存在的'Date'標題來滾動自己的嘗試。 – 2013-04-24 06:49:35

+2

在任何情況下,您都可以使用一個後端實例,這將成爲統一時鐘的單點:https://developers.google.com/appengine/docs/python/backends/ – 2013-04-24 07:18:44

相關問題