您的 urlfetch.Fetch() 响应时间过长(超过 60 秒),因此超时。这是一篇关于它的文章https://cloud.google.com/appengine/articles/deadlineexceedederrors
一种解决方案是使用任务队列。任务队列有更长的超时时间,或者更恰当地说,让您将作业分成更小的部分。
https://cloud.google.com/appengine/docs/python/taskqueue/
这里是一个简单的例子,说明如何使用“推送”任务队列来做到这一点。我意识到从一个数据存储模型到另一个可能不是您正在寻找的冗余。您可能希望将数据存储实体完全备份到另一个应用程序或另一种类型的数据库或云服务。您可能还有多个要备份的模型。这只是一个使用 cron 作业每 24 小时设置和安排“推送”任务队列的简单示例:
首先你必须在你的 app.yaml 中添加“deferred”:
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
将 /backup 添加到您的 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)
希望对你有帮助。