我的应用程序需要对每个请求执行许多数据存储操作。我想并行运行它们,以获得更好的响应时间。
对于数据存储更新,我正在进行批处理处理,因此它们都是异步进行的,这节省了许多毫秒。App引擎允许多达500个实体并行更新。
但我还没有找到允许并行执行不同类型的数据存储获取的内置函数。
由于App确实允许urlfetch调用异步运行,所以我为每种类型创建了一个getter URL,它以JSON格式的文本返回查询结果。现在,我的应用程序可以对这些URL执行异步URLs调用,这可以并行处理数据存储获取。
这种技术适用于少量的并行请求,但是attempting在尝试同时运行超过5或10个这些urlfetch调用时会抛出错误。
我现在只是在测试,所以每个urlfetch都是相同的查询;因为它们在小卷中工作很好,但在多个同时请求中开始失败,所以我认为它肯定与异步urlfetch调用有关。
我的问题是:
发布于 2010-02-05 02:35:26
由于App允许异步use获取调用,但不允许异步数据存储获取,所以我试图使用urlfetch并行地从数据存储检索。
异步数据存储的缺乏是一个公认的问题:
http://code.google.com/p/googleappengine/issues/detail?id=1889
现在有了一个允许异步查询的第三方工具:
http://code.google.com/p/asynctools/
异步工具是一个库,允许您并行执行Google调用。API调用可以混合在一起并排队,然后所有调用都并行启动。
这正是我要找的。
发布于 2009-12-27 15:06:59
虽然我担心我不能直接回答你提出的任何问题,但我认为我应该告诉你,你所有这些方面的研究可能不会为你的问题找到一个可行的解决方案。
问题是,数据存储写入要比读取时间长得多,所以如果您找到了一种方法来最大限度地增加可能发生的读取数量,那么您的代码就会耗尽很长时间,才能对您所读的所有实体进行相应的写入。
我会认真考虑重新考虑数据存储类的设计,以减少需要进行的读写次数,因为这将很快成为应用程序的瓶颈。
发布于 2009-12-30 06:59:59
您考虑过使用TaskQueues来对以后执行的请求进行排队吗?
如果任务返回4xx状态,它将被视为失败,并将在以后重新尝试-因此您可以将错误传回并让任务队列处理重试请求,直到成功为止。此外,通过对存储桶大小和速率的一些实验,您可能会让Task队列放慢请求的速度,从而使数据库无法最大化
还有一个很好的包装器(deferred.defer),它使事情变得更简单--您可以对应用程序中的任何函数(几乎)进行延迟调用。
https://stackoverflow.com/questions/1965297
复制相似问题