2016-07-03 87 views

回答

0

你urlfetch.Fetch()花費的時間太長(大於60秒),以respsond,所以它是超時。下面是關於它的文章https://cloud.google.com/appengine/articles/deadlineexceedederrors

一種解決方案是使用任務隊列。任務隊列有更長的超時時間,或者更恰當地說,您可以將作業分成更小的部分。 https://cloud.google.com/appengine/docs/python/taskqueue/

下面是一個簡單的例子,說明如何使用「推送」任務隊列執行此操作。我意識到從一個數據存儲模型轉到另一個可能不是你想要的冗餘。您可能想要將數據存儲實體備份到另一個應用程序或其他類型的數據庫或雲服務。你也可能有多個你正在備份的模型。這是使用每24小時一個cron作業設置和安排「推」任務隊列的只是一個簡單的例子:

首先你必須添加「推遲」到你的app.yaml中的內建的:

builtins: 
- deferred: on 

接下來,您需要創建第二個數據存儲模型中,我們將稱之爲「備份」只是複製粘貼您的舊模式,將其重命名備份 - 它有助於使用相同型號的相同版本的備份,而不是相同的模式,因爲你可以給他們相同的主鑰匙和備用鑰匙:

class Backup(db.Model): # example 
    prop1 = db.StringProperty() 
    prop2 = db.StringListProperty() 
    prop3 = db.StringProperty() 

下一頁設置你cron.yaml cron作業:

- description: Creates a backup of the target db every 24 hours at 10:45 GMT 
url: /backup 
schedule: everyday 10:45 

添加/備份至app.yaml處理程序:

- url: /backup 
script: mybackup.py 
login: admin 

最後,創建mybackup.py

from google.appengine.ext import deferred 
from google.appengine.ext import db 
#from google.appengine.ext import ndb 

def backup_my_model(model_name): 
    """ 
    Takes all enities in the model_name model and copies it to Backup model 
    """ 
    logging.info("Backing up %s" % model_name) 
    query = db.GqlQuery('SELECT * From %s ' % model_name) 
    for primary_db in query: 
     backup = Backup(key_name = primary_db.key_name) 
     backup.prop1 = primary_db.prop1 
     backup.prop2 = primary_db.prop2 
     ... 
     backup.put() 



deferred.defer(backup_my_model, MyModel) #where MyModel is the model you want to backup 
deferred.defer(backup_my_model, MyOtherModel) 
... 
deferred.defer(backup_my_model, MyFinalModel) 

我希望有所幫助。

+0

我正在使用數據存儲管理員,據我所知,沒有辦法設置任務隊列使用:http://screencast.com/t/H6cTrvvr – ThomasD

+0

爲了完成你正在嘗試做的事情與任務,你將不得不從你的應用程序,而不是從數據存儲管理員。我將更新我的代碼,給出一個簡單的例子,說明如何從一個數據存儲模型到另一個數據存儲模型。 – Doug

+0

我正在嘗試備份我的生產數據庫並在我的測試環境中恢復它。所以我試圖將生產谷歌應用程序引擎應用程序的數據複製到谷歌應用程序引擎測試應用程序。據我可以告訴你上面的代碼將數據複製到同一應用程序中的另一個模型,而不是跨應用程序? – ThomasD

相關問題