GAE错误204 - 这是什么意思我如何避免它?

时间:2012-11-28 21:47:22

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

我收到一个空白屏幕,日志中显示以下警告消息:

A problem was encountered with the process that handled this request, 
causing it to exit. This is likely to cause a new process to be used for
the next request to your application. (Error code 204)

我没有别的事情继续下去。我正在大量使用tasklets(@ ndb.tasklet),async datastore ops和async urlfetches(它是一个搜索引擎)。据appstats说,我正在嘎吱嘎吱,例如15分钟的处理时间到15秒。如果我处理的数据较少,则可行。如果我处理更多,它会因上述警告而失败。实例选项卡仅显示一次实例。我的预感是我正在重载那个实例。

我认为额外的实例会自动启动以支持额外的负载 - 尽管实例可能只响应请求而不是CPU /内存负载?当我启动三个不同的页面时,三个不同的实例也会启动。问题是每个请求都需要大量处理。

我可以使用任务队列来定位后端实例,但我需要知道任务何时完成并返回结果。不幸的是,任务队列有no way of monitoring when a given task has been completed

我如何(并且应该)跨实例显式拆分处理?还有其他解决方案吗?如何避免204错误消息?

编辑: 我通过以下方式提高了递归限制:

sys.setrecursionlimit

当我发表评论时,我收到以下错误:

RuntimeError: maximum recursion depth exceeded

1 个答案:

答案 0 :(得分:1)

递归限制让我认为你将同步操作与异步操作混合在一起。尝试使用async ops和yield,而不是get_result()。或者向我们展示一些(真实的)代码。

特别是,提高递归限制最终会导致C级堆栈溢出,这很可能会导致内核无意中杀死进程。在这种情况下,日志也会丢失。在提出递归限制之前,您获得了什么样的堆栈跟踪?它是〜1000个条目,还是只有几十个?如果是后者,你肯定会遇到混合同步和异步操作的问题。

请注意,有两种形式的同步操作,在tasklet中的任何地方都可以避免(以及它调用的任何内容!):同步调用,如ent.put(),key.get();和异步调用后跟get_result()调用,如ent.put_async()。get_result()。