2009-12-25 77 views
1

嗨,我已經搜索了App Engine組,但找不到明確的解決方案。Google App Engine Put()超時

我想將1000個實體放到我的App Engine服務器(生產服務器)中,但是我得到超時錯誤和500個服務器錯誤。它在當地發展中完美運作。

爲了減少Put負載,我在每10次投入後讓代碼休眠5秒鐘。我仍然得到了同樣的錯誤:(

請點我在正確的方向非常感謝您的見解

代碼:。

class User(db.Model) 
    nickname = db.StringProperty() 
    feed = db.StringListProperty() 

class Initialize(webapp.RequestHandler): 
    def get(self): 
    self.response.headers['Content-Type'] = 'text/plain' 
    start = 0 
    end = 10 

    #add 1000 users (10 Puts x 100 rows) 
    for row in range(1,100): 
    for i in range(start,end): 
     nickname = "nickname" + str(i) 
     feed = ["string1","string2","string3","string4","string5"] 

     User(key_name=str(i),nickname=nickname,feed=feed).put() 

     self.response.out.write('Entry %s done\n' % i) 

    #add counters by 10 
    start = start + 10 
    end = end + 10 

    #sleep 
    time.sleep(5) 

    self.response.out.write('Initialized 1000 users for Datastore.') 

回答

2

我建議您需要將批量寫入批處理,因爲寫入操作需要大量時間,否則您將超出每個請求的AppEngine的最大CPU使用率。分解成批的正確方法是有多個單獨的請求,每個請求都添加少量記錄。

因此,編寫Initialize處理程序,以便可以多次調用它,每次調用完成整個工作的一小部分。

1

我做了5秒鐘的代碼睡眠後,每10 puts

這是行不通的,因爲你的請求在它超時之前只需要一定的時間。那個限制。

您需要將您的操作拆分爲多個請求,例如使用任務隊列。

+0

來自App Engine的任務隊列API目前是實驗性的。有沒有其他方法已經被使用?謝謝。 – fooyee 2009-12-25 14:03:48

+0

我現在正在考慮一個cron工作。使用它是一個好主意嗎? – fooyee 2009-12-25 14:07:34

1

還有一件要考慮的事情是GAE有時會在應用程序休眠一段時間後的第一個請求中出錯/超時。似乎需要一段時間才能「喚醒」應用程序,如果應用程序在幾個小時內處於非活動狀態,那麼在這樣的時間之後的第一個請求幾乎會自動出現。

在初始故障後,您是否嘗試過重新執行您的請求?

+0

我將腳本重新編碼爲一個簡單的for循環與100個投入。 我在網頁瀏覽器中手動輸入了10次back2back。有效。 我會嘗試查看任務隊列API。 – fooyee 2009-12-25 14:41:47

1

數據存儲區超時更可能出現在大容量存儲器中,因此最簡單的解決方案是以較小的批次存儲記錄。如果您的執行時間耗盡(請求超時),則需要使用任務隊列將操作分解爲許多小請求。