如何通过大量查询处理60秒超时

时间:2012-10-17 09:34:15

标签: python google-app-engine google-cloud-datastore

我必须在我的数据存储区中进行一些繁重的查询才能获得一些高级信息。当它达到60秒时,我得到一个错误,我认为它超时了:

Traceback (most recent call last):
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 207, in Handle
result = handler(dict(self._environ), self._StartResponse)
File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1505, in __call__
rv = self.router.dispatch(request, response)
File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1253, in default_dispatcher
return route.handler_adapter(request, response)
File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1077, in __call__
return handler.dispatch()
File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 545, in dispatch
return method(*args, **kwargs)
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/admin/__init__.py", line 140, in xsrf_required_decorator
method(self)
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/admin/__init__.py", line 348, in post
exec(compiled_code, globals())
File "<string>", line 28, in <module>
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py", line 2314, in next
return self.__model_class.from_entity(self.__iterator.next())
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py", line 1442, in from_entity
return cls(None, _from_entity=entity, **entity_values)
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py", line 958, in __init__
if isinstance(_from_entity, datastore.Entity) and _from_entity.is_saved():
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/api/datastore.py", line 814, in is_saved
self.__key.has_id_or_name())
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/api/datastore_types.py", line 565, in has_id_or_name
elems = self.__reference.path().element_list()
DeadlineExceededError

这不是应用程序查询,我通过交互式控制台与我的应用程序进行交互,因此这不是一个实时问题。我的问题是我必须遍历所有应用程序用户,检查我需要为每个用户检索的大量数据。我可以通过对其user_id进行硬编码来逐一进行,但这将是缓慢且无效的。

你能想到我能以更快的方式做到这一点吗?无论如何选择5到5个用户,比如LIMIT = 5只获得前5个用户,但是如果我能得到的话,那将是很好的,首先是5个用户,之后是接下来的5个用户,依此类推,迭代所有这些但是查询更轻松。我可以设置更长的超时吗?

你能想到我能解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

您可以使用光标从上次停止的地方获取搜索结果与限制:

  

返回base64编码的游标字符串,表示在检索到的最后一个结果之后查询结果集中的位置。游标字符串可以安全地用于HTTP GET和POST参数,也可以存储在数据存储区或Memcache中。将来调用同一查询可以通过start_cursor参数或with_cursor()方法提供此字符串,以便从此位置继续检索结果。

https://developers.google.com/appengine/docs/python/datastore/queryclass#Query_cursor

答案 1 :(得分:0)

我会写一个简单的请求处理程序来完成任务。

以可以在mapreduce上运行的方式编写它,或者启动后端来运行你的处理程序。

答案 2 :(得分:0)

首先,通过批量获取实体,可以显着减少应用程序与数据存储区的通信时间。有关详细信息,请查看10 things you (probably) didn't know about App Engine

然后,您可以将此过程分配给任务队列,使您可以执行最多10分钟的任务。有关任务队列的更多信息,请查看The Task Queue Python API

最后,对于需要更多时间的任务,您还可以考虑使用后端。有关详细信息,请查看Backends (Python)

希望这有帮助。