所以我有一个BlobstoreUploadHandler类,使用put_async并等待如下:
x = Model.put_async()
x.wait()
然后继续将一些数据传递给javascript,以便用户被重定向到提供文件上传的类,它就是这样:
redirecthref = '%s/serve/%s' % (
self.request.host_url, Model.uploadid)
self.response.headers['Content-Type'] = 'application/json'
obj = { 'success' : True, 'redirect': redirecthref }
self.response.write(json.dumps(obj))
这一切都运行良好,然而,这次重定向需要花费大量时间才会发生,我们正在谈论分钟,并且在文件上传时,页面被完全冻结。我注意到我能够访问javascript重定向到的链接,即使在上传发生且页面被冻结时,我的问题是,我可以采取什么策略来使重定向在网址可用时正确发生?这是put_async的'callback'参数是什么,或者这是我想要查看url_fetch的地方。
我对此非常陌生,所有的帮助都表示赞赏。谢谢!
更新:
所以我发现上传速度很慢有几个原因: 我应该使用put()而不是put_aync(),我发现它确实加快了上传时间,但是有些东西正在破坏,它给我一个500错误看起来像:
POST http://example.com/_ah/upload/AMmfu6au6zY86nSUjPMzMmUqHuxKmdTw1YSvtf04vXFDs-…tpemOdVfHKwEB30OuXov69ZQ9cXY/ALBNUaYAAAAAU-giHjHTXes0sCaJD55FiZxidjdpFTmX/ 500 (Internal Server Error)
它仍会上传两个资源,但重定向不起作用。我相信这是在创建的upload_url上发生的,它是使用
创建的upload_url = blobstore.create_upload_url('/upload')
除此之外,即使使用put()而不是put_async(),wait()方法仍然需要花费过多的时间。 如果我删除x.wait(),上传仍然会发生,但重定向给了我:
IndexError: List index out of range
我的/ serve类Handler
的以下行引发了此错误qry = Model.query(Model.uploadid == param).fetch(1)[0]
简而言之,我相信在上传后服务实体的最快方法是取出x.wait(),而不是使用try:和:在查询上,以便它一直尝试提供服务页面直到它没有得到listindex错误。 就像我说的那样,我对此非常陌生,所以实际上让这种情况发生的有点超过我的技能水平,因此任何想法或评论都非常受欢迎,我总是很乐意提供更多的代码或解释方式。谢谢!
答案 0 :(得分:1)
异步调用是指当你完全不关心它何时完成时向后台发送内容。在我看来,你正在寻找一个推杆。
根据定义,put_async并不意味着快速完成。当你的实例有时间做它时,它会向后面发送一些东西。你在寻找我认为的看跌期权。它会像你的等待一样冻结你的应用程序,但不是等待异步完成的长时间,它将立即开始处理它。
如异步文档(https://developers.google.com/appengine/docs/java/datastore/async)中所述:
但是,如果您的应用程序需要get()的结果以及Query的结果来呈现响应,并且get()和Query没有任何数据依赖性,那么请等待get( )完成启动查询是浪费时间。
似乎不是你在做什么。您以纯粹同步的方式使用异步调用。完成比简单的放置需要更长的时间。除非有某些理由推动“put”花费更长时间,否则你不应该使用async
答案 1 :(得分:0)
回想起来,我想在这个问题上圈起来,因为我在发布它后不久就解决了这个问题。我发现除了使用 put 而不是 put_async 当然没有办法真正加快上传速度。
但是有一个棘手的方法来访问我的重定向 URL 中的 blob,除了通过 Model.uploadid 之外,它不能保证在重定向发生时始终上传。
解决方案是使用上传对象的 .keys() 方法简单地访问 blob,并将其传递到 redirect_href,而不是 Model.uploadid
redirecthref = '%s/serve/%s' % (self.request.host_url, self.get_uploads(‘my_upload_object’)[0].key())
不知道为什么 .keys() 查找似乎绕过了整个上传过程,但这似乎对我有用。
谢谢,